首页 > 解决方案 > 从“div”下拉列表中选择元素 - Selenium

问题描述

我有一个“div”下拉菜单,而不是“select”。所以我的功能在任何地方都可以正常工作,除了不是从下拉按钮位置打开的下拉菜单,而是从上方(因为下拉菜单放置在页面底部)以防止...页面滚动我猜?也许问题是它打开得太快或太慢或什么,所以功能通常不是点击所需的元素,而是最接近它的元素之一。大多数情况下,如果元素不在下拉列表的开头,它会以这种方式工作,因此它会滚动到元素。有什么建议可以做吗?

我发现最好的方法是使用动作,拆分移动到元素并点击成 2 行(如果写成 1 行效果会更糟)。顺便说一句,“waitVisibilityOfElement(By)”是一个带有 webdriver 等待预期条件的函数

public void selectFromDropdown(By by) {
        Log.debug("selecting from dropdown by" + by);
        waitVisibilityOfElement(by);
        Actions actions = new Actions(wrappedWebDriver);
       actions.moveToElement(wrappedWebDriver.findElement(by)).perform();
        Log.debug("clicking dropdown item");
        wrappedWebDriver.findElement(by).click();
}

我希望点击需要的元素,但通常它会点击另一个

好的,在一些帮助下,我做出了最终决定,如果其他简单方法不适合您,这是选择下拉过滤器而不使用任何 .sleep() 函数的最佳方法。

public void selectFromDropdown(By by) {
        Log.debug("selecting from dropdown by" + by);
        WebElement eleV = wrappedWebDriver.findElement(by);

        waitVisibilityOfElement(by);

        JavascriptExecutor js = (JavascriptExecutor) wrappedWebDriver;
        js.executeScript("arguments[0].scrollIntoView();", eleV);

        Actions actions = new Actions(wrappedWebDriver);
        actions.moveToElement(wrappedWebDriver.findElement(by)).perform();
        Log.debug("clicking dropdown item");
        wrappedWebDriver.findElement(by).click();
    }

标签: javascriptjavaseleniumselenium-webdriver

解决方案


您是否尝试在单击之前添加长笛等待?这可能会有所帮助。如果您可以在该问题中分享有关 DOM 的信息,那也很棒吗?这是 java 的一个示例,但我认为这也可以在 js 中为您提供帮助。

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
    .withTimeout(30, SECONDS)
    .pollingEvery(5, SECONDS)
    .ignoring(NoSuchElementException.class);

推荐阅读