Семафорные проблемы в Java с Обеденными Философами

Трудно понять, как ответить на ваш вопрос без каких-либо подробностей, на странице есть несколько элементов, у которых есть количество зачеркнутых / непроходных.

Для общего решения вы можете использовать следующее: оно будет соответствовать нескольким блокам, которые имеют цены. Если вы хотите что-то более целенаправленное, вам понадобится немного более сложный локатор, который определяет товар, а также ценовой блок. Если вам нужен только первый ценовой блок на странице, это будет работать:

//*[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

Вы затем нужно будет проанализировать строку, чтобы удалить первые две строки (хотя это не очень хорошее и надежное решение).

5
задан Logan Serman 3 March 2009 в 16:27
поделиться

3 ответа

Я вынул бы 'синхронизируемое' ключевое слово из Ваших сигнатур методов. Вы используете внешний механизм блокировки (семафор, в этом случае). 'Синхронизируемое' ключевое слово пытается получить блокировки с помощью собственного взаимного исключения объекта. Вы теперь соединяете 2 ресурса, которые я подозреваю, мог бы вызывать мертвую блокировку.

8
ответ дан 13 December 2019 в 19:36
поделиться

Проблема состоит в том, что, когда thread1 имеет определенную палочку для еды и другой пытается получить того же, он будет ожидать в take()- метод на строке this.lock.acquire(); но это НЕ выпустит монитор на самом объекте.

Если теперь thread1 пытается выпустить палочку для еды, это не может войти release()- метод, так как это все еще заблокировано другим потоком, ожидающим в take(). Это - мертвая блокировка

1
ответ дан 13 December 2019 в 19:36
поделиться

Это кажется немногим путающим это, Вы и соединяете палочку для еды и имеете ее, содержат семафор размера 1. Обычно семафор предоставляет билеты ресурсу и если у Вас есть только один билет, это - эффективно взаимное исключение, которое идентично блокировке (или синхронизируемый блок или Объект блокирования). Вы могли бы считать на самом деле создание Палочки для еды самим объектом блокирования.

Я сделал сообщение в блоге на обеденных философах в Java некоторое время назад, если Вам интересно, хотя это действительно о том, как избежать мертвой блокировки при помощи других стратегий.

1
ответ дан 13 December 2019 в 19:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: