无法选择选项:找到元素但不可见

时间:2018-10-12 09:46:27

标签: selenium selenium-webdriver selenium-chromedriver

我正在尝试使不受我控制的网站自动化,因此无法更改其HTML和CSS。我需要从组合框中选择一个选项。

我可以成功找到“ select ../>”元素,但是当我尝试通过SelectByText,ByValue,ByIndex选择选项时,将导致ElementNotVisibleException。该页面上的html非常复杂,我相信开发人员可以通过CSS样式分配“ display:none”。我可以导航到包含该组合框的“ div”,然后通过“动作”单击它,但此后无助于选择一个选项。单击后,我会在屏幕上看到一秒钟的选项,然后组合框会折叠。

有没有可能克服这个问题?

2 个答案:

答案 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上进行检查,但无法通过硒进行访问。
当这些元素在屏幕上可见时,您可以很好地选择这些元素。

解决方案是找出选择标记之前,您必须先单击它才能获得可见的完整选项标记。
单击使客户端现在可以看到所有需要选择的选项。 然后找到该选择元素,然后在选择标记下选择选项。当这些选项列表在屏幕上完全可见时。