Невозможно выбрать опцию: элемент найден, но невидим - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь автоматизировать сайт, который не находится под моим контролем, поэтому я не могу изменить его HTML и CSS.Мне нужно выбрать опцию из поля со списком.

Я могу успешно найти элемент "select ../>", но когда я пытаюсь выбрать опцию через SelectByText, ByValue, ByIndex, это приводит к исключению ElementNotVisibleException.HTML-код довольно сложен на этой странице, и я считаю, что разработчики назначили «display: none» в стиле css.Я могу перейти к «div», который содержит это поле со списком и нажмите на него через действия, но это не помогает выбрать вариант после этого.После такого щелчка я на секунду вижу варианты на экране, а затем поле со списком падает.

Можно ли вообще решить такую ​​проблему?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Поскольку Selenium API пытается быть «ориентированным на пользователя», он не позволяет взаимодействовать с невидимыми элементами.Есть два подхода, которые вы можете попробовать:

1) Нажмите на элемент select, затем выполните явное ожидание, чтобы option стал видимым.Это полезно, если на странице используется JavaScript для отображения опций выбора, которые могут вызвать небольшую задержку.

By bySelect = By.id("id_of_select_element");
By byOption = new ByChained(bySelect, By.xpath(".//option[contains(text(), 'text_of_option')]");

WebElement select = driver.findElement(bySelect);
select.click();
try {
    // wait at-most 5 seconds for element to become visible
    WebElement option = new WebDriverWait(driver, 5)
        .until(ExpectedConditions.visibilityOfElementLocated(byOption)));   
} catch(TimeoutException t) {
    System.err.println("Timed out while waiting for dropdown to become visible: " + byOption.toString());
}

2) Если вышеприведенное не работает, вы можете быть немного более агрессивным и выполнить некоторый JavaScriptзаставить option быть выбранным.Это рекомендуется только в крайнем случае.

public void selectDropdownByText(WebDriver driver, WebElement select, String text) {
    ((JavascriptExecutor) driver).executeScript(
        "var select = arguments[0]; for(var i = 0; i < select.options.length; i++) {if(select.options[i].text == arguments[1]) {select.options[i].selected = true; }}", select, text);
}
0 голосов
/ 12 октября 2018

хорошо, элемент не виден, исключение выдается из-за "ориентированного на пользователя" поведения селена,
Из моего опыта работы я узнал, что
Selenium не может выбрать элемент, который не виденклиенты.
Я имею в виду, я не могу выбрать тех, кто не появляется в окне пользовательского интерфейса,
Тем не менее, вы можете просматривать в HTML DOM, но не можете получить доступ через селен.
Когда они видны на экране, вы можете очень хорошовыберите эти элементы.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...