代码之家  ›  专栏  ›  技术社区  ›  EngineerSpock

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

  •  0
  • EngineerSpock  · 技术社区  · 7 年前

    我正在尝试自动化一个不在我控制之下的网站,所以我不能改变它的html和css。我需要从组合框中选择一个选项。

    我可以成功地找到一个“select../>”元素,但是当我尝试通过selectByText、ByValue和ByIndex选择一个选项时,它会导致elementNotVisibleException。html在页面上相当复杂,我相信开发人员通过css样式指定了“display:none”。我可以导航到包含该组合框的“div”,然后通过actions单击它,但是在这之后选择一个选项是没有帮助的。单击之后,我看到屏幕上的选项有一秒钟,然后组合框将折叠。

    有可能克服这样的问题吗?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Joe Coder    7 年前

    由于selenium api试图以“用户为中心”,因此它不允许与不可见的元素进行交互。有两种方法可以尝试:

    1)点击 select 元素,然后执行显式等待 option 变得可见。如果页面使用javascript显示可能导致轻微延迟的select选项,这将非常有用。

    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来强制 选项 被选中。这只是作为最后的手段才被推荐。

    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);
    }
    
        2
  •  2
  •   Ashish Kamble    7 年前

    好的,元素不可见异常被抛出,因为selenium的“以用户为中心”的行为,
    在我的工作经验中我发现,
    Selenium无法选择客户端不可见的元素。
    我的意思是不能选择那些不出现在用户界面窗口的人,
    不过,这些仍然是您可以在html dom上进行检查,但无法通过selenium进行访问。
    当这些元素在屏幕上可见时,您可以很好地选择这些元素。

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