我正在尝试自动化一个不受我控制的网站,所以我无法更改其HTML和CSS。我需要从组合框中选择一个选项。
我可以成功地找到一个"选择./>"元素,但是当我尝试通过SelectByText,ByValue,ByIndex选择一个选项时,它会导致ElementNotVisibleException。该页面上的html非常复杂,我相信开发人员通过css样式分配了"display:none"。我可以导航到包含该组合框的"div"并通过"操作"单击它,但之后选择一个选项无济于事。单击后,我看到屏幕上的选项一秒钟,然后组合框折叠。
是否有可能克服这样的问题?
由于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);
}
好的,元素不可见 由于硒的"以用户为中心"的行为而抛出异常,
在我的工作经验中我发现,
Selenium 无法选择客户端不可见的元素。
我的意思是不能选择那些没有出现在UI窗口中的人,
仍然是那些你可以在HTML DOM上检查但不能通过硒访问的人。
当这些元素在屏幕上可见时,您可以很好地选择这些元素。
解决方案是在找到选择标签之前,您必须单击它以获得可见的完整选项标签。
单击可使客户端看到需要选择的所有选项。 然后,您找到该选择元素,然后在选择标签下选择选项。当这些选项列表在屏幕上完全可见时。