【问题标题】:Selecting elements from "div" dropdown - Selenium从“div”下拉列表中选择元素 - Selenium
【发布时间】:2019-05-27 16:00:07
【问题描述】:

我有一个“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();
    }

【问题讨论】:

标签: javascript java selenium selenium-webdriver


【解决方案1】:

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

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

【讨论】:

  • 其实我用的是java。没有抛出“nosuchelement”异常,只是我猜点击器比菜单打开(打开动画)更快。 dom代码很难给出,因为它是由js自动生成的。只是很多 od div\spans =)
【解决方案2】:

在将鼠标移到预期的元素值并单击之前,您是否尝试滚动到预期的元素值。希望以下代码可以提供帮助:

public void selectFromDropdown(By by) {
    Log.debug("selecting from dropdown by" + by);
    var eleValue = wrappedWebDriver.findElement(by);
    Log.debug("Scroll to element");
    browser.executeScript("arguments[0].scrollIntoView();", eleValue);
    waitVisibilityOfElement(by);
    Actions actions = new Actions(wrappedWebDriver);
    actions.moveToElement(eleValue).perform();
    Log.debug("clicking dropdown item");
    eleValue.click();
}

【讨论】:

  • 我正在使用 java 所以“var”和“browser”它们是什么?这里需要添加js执行器吗?
  • 好的你的回答对我有帮助,但我必须自己修改它,我将它发布到标题中
  • 是的@VACUUM,我很高兴从你这里:)
【解决方案3】:

如果您尝试单击静态值,则可以直接从下拉列表中单击该值

你可以试试这个

driver.findElement(By.xpath("THE VALUE FROM DROPDOWN")).click();

【讨论】:

  • 如您所见,这一行用于我的函数的末尾。我也是按价值选择的。问题是通常会选择菜单的另一个元素,该元素放置在所需元素附近。我猜这是因为 selenium 的点击速度比菜单打开动画的速度更快
  • 可能。您可以尝试添加一个 thread.sleep() 以确保它不是导致问题的网络加载速度。
  • 太棒了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多