【问题标题】:WebDriver Dropdown Menu Won't Stay OpenWebDriver 下拉菜单不会保持打开状态
【发布时间】:2019-01-11 14:05:57
【问题描述】:

我正在使用 Selenium / Java,并且在触发事件的下拉框上有一个有趣的问题...我不能使用 Select,因为下拉列表使用的是有组织的列表,而不是选择和选项(当盒子已关闭):

    <section id="..." class="ember-view">
     <ol id="...">
       <li id="...">

我成功点击下拉框:element.click(); 下拉框打开!但是当下一行执行时它会再次关闭(这只是一个System.out.println("...");)。

我很困惑。我试过了

JavascriptExecutor jse = (JavascriptExecutor)driver
jse.executeScript("$(arguments[0]).change()", element);

    jse.executeScript("$(arguments[0]).focus()", element);

甚至

    jse.executeScript("$(arguments[0]).blur()", element);

在我点击下拉框之前和之后,但那个小傻瓜不会一直打开!当我将参数的值打印到控制台System.out.println(jse.executeScript("$(arguments[0])); 时,参数为空...我不确定这是什么意思。

【问题讨论】:

  • 手动也会发生同样的行为吗?如果您将鼠标悬停在它上面,它会保持打开状态吗?为什么不用JS本身来点击呢?
  • 没有。手动单击它并保持打开状态。我不能在自动化中将鼠标悬停在它上面,因为一旦执行下一行,菜单就会消失。执行 JS 单击具有相同的效果,与使用 Actions 类并移动到元素,然后执行操作一样。
  • 你能作弊并尝试使用 sendKeys 到下拉元素吗?

标签: javascript java selenium webdriver automated-tests


【解决方案1】:

如果您在单击下拉列表时没有更改类,那么您将单击它,并且在您单击它之后它就会消失。尝试使其始终显示下拉菜单并添加一个在单击时消失的类,称为“隐藏”或“删除显示”,就像这样

hide { display:none }

然后放到html元素中。

<htmlElement class="alwaysShowThis hide"></htmlElement>

确保在单击它时删除 hide 类,然后您可以在其上放置一个计时器或仅检测您何时将鼠标悬停在其上。

javascript 可能如下所示:

display(event) {
  if(/*checkfor hide class existing*/){
     //remove hide class
  }
}
hide() {
  if(alwaysShowThis or its id is not being hovered over){
     //add hide class to its classes
  }
}

我的意思是这些只是一些 5 分钟的建议,显然有一种方法可以更好地编写这些,但我并没有想到它们,但你可以很容易地找到如何完成所有这些事情。

【讨论】:

  • 感谢@Raults 的回复!但是我应该声明我只是在网站上进行功能测试......我没有写它,我没有能力改变HTML。我唯一能做的就是通过 Selenium 和 Java 与它进行交互(也许还有一些 JS 脚本通过 JavascriptExecutor)。不过,我非常感谢您的帮助!
  • 啊,是的,硒,确实有所作为。您需要弄乱摆弄下拉列表的实际功能。有时像实际用户一样对待您的测试是可行的,但在时间和异步方面会出现很多问题。在几乎所有情况下,测试以查看 javascript 的工作原理与实际单击下拉菜单一样好。
  • @Raults 不,不一样,代码中的单击操作几乎在每种情况下都不如实际单击下拉菜单。用户与前端的交互可能有几个用例,需要用户进行交互,否则 100% 单元测试的代码将是无错误的代码,但情况并非如此,:)。
  • 我认为测试实际点击次数比测试时间更好的情况很少,在大多数情况下没有必要这样做。我的意思是,这也取决于你使用的东西,django、聚合物、ruby、angular2、w/e,但如果没有人确切解释它为什么优越,我会很难推销它。
【解决方案2】:

我非常感谢大家的贡献,但我从未真正找到发生这种情况的原因。所以,我尝试了作弊......

我把它全部放在一个 try / catch 块中,这似乎减慢了它足以处理事件的速度。当然,catch 是无用的,因为它永远无法到达,但它确实有效。

我知道,这完全是个黑客行为。我仍然有兴趣找到这种行为的原因,但在那之前,我们会继续!

【讨论】:

    【解决方案3】:

    遇到了类似的问题,通过将光标移动到下拉列表来解决。

    public void hover(WebElement element) {
        Actions builder = new Actions(driver());
        builder.moveToElement(element).perform();
    }
    

    之后它保持打开状态,我可以单击我的选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-15
      • 2011-11-05
      • 1970-01-01
      相关资源
      最近更新 更多