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