Трудно понять, как ответить на ваш вопрос без каких-либо подробностей, на странице есть несколько элементов, у которых есть количество зачеркнутых / непроходных.
Для общего решения вы можете использовать следующее: оно будет соответствовать нескольким блокам, которые имеют цены. Если вы хотите что-то более целенаправленное, вам понадобится немного более сложный локатор, который определяет товар, а также ценовой блок. Если вам нужен только первый ценовой блок на странице, это будет работать:
//*[contains(@class,'price')]
Это то же самое, что и следующий CSS-селектор (который гораздо менее сложен)
.price
Однако разметка будет вызывать проблемы, она выглядит следующим образом:
<div class="col-md-3 col-sm-4 price">
<del style="font-size:15px;color:#aaa">$ 85.00</del>
<br>
$ 20.00
</div>
В строгом XPath вы можете сделать это, используя XPath вроде:
//*[contains(@class,'price')]/text()
Однако Selenium не позволяет вам связать текстовый узел в WebElement. Это означает, что хотя вышеуказанный Xpath будет работать непосредственно в браузере, он не будет работать как локатор для поиска WebElement (поскольку он не находит элемент, он находит текстовый узел).
Лучший способ это исправить - поднять ошибку и заставить разработчика размещать количество, которое не вычеркнуто, в его собственный элемент (например, обернуть его <span>
).
В качестве хакерского обходного пути вы можете попробовать получить внутренний HTML-код элемента следующим образом:
WebElement price = driver.findElement(By.cssSelector(".price"));
String elementHTML = price.getAttribute("innerHTML");
Элемент StringHTML будет содержать следующее:
<del style="font-size:15px;color:#aaa">$ 85.00</del>
<br>
$ 20.00
Вы затем нужно будет проанализировать строку, чтобы удалить первые две строки (хотя это не очень хорошее и надежное решение).
Я вынул бы 'синхронизируемое' ключевое слово из Ваших сигнатур методов. Вы используете внешний механизм блокировки (семафор, в этом случае). 'Синхронизируемое' ключевое слово пытается получить блокировки с помощью собственного взаимного исключения объекта. Вы теперь соединяете 2 ресурса, которые я подозреваю, мог бы вызывать мертвую блокировку.
Проблема состоит в том, что, когда thread1 имеет определенную палочку для еды и другой пытается получить того же, он будет ожидать в take()
- метод на строке this.lock.acquire();
но это НЕ выпустит монитор на самом объекте.
Если теперь thread1 пытается выпустить палочку для еды, это не может войти release()
- метод, так как это все еще заблокировано другим потоком, ожидающим в take()
. Это - мертвая блокировка
Это кажется немногим путающим это, Вы и соединяете палочку для еды и имеете ее, содержат семафор размера 1. Обычно семафор предоставляет билеты ресурсу и если у Вас есть только один билет, это - эффективно взаимное исключение, которое идентично блокировке (или синхронизируемый блок или Объект блокирования). Вы могли бы считать на самом деле создание Палочки для еды самим объектом блокирования.
Я сделал сообщение в блоге на обеденных философах в Java некоторое время назад, если Вам интересно, хотя это действительно о том, как избежать мертвой блокировки при помощи других стратегий.