Java Selenium 2.37 XPath,在上下文菜单中查找一个项目,然后再次单击该项目

Java Selenium 2.37 XPath,在上下文菜单中查找一个项目,然后再次单击该项目,java,xpath,selenium-webdriver,Java,Xpath,Selenium Webdriver,在Selenium 2.37中,当我分两步搜索时,我可以单击上下文菜单中的“打开”项: 通过搜索以下XPath查找一些WebElement: td[@class=\“dijitmeneuitemlabel\”和“+”以(@id,\“dijit\u MenuItem\”)开头] 然后,对于这个WebElement列表中的每个WebElement,我会 字符串s=we.getText();如果(s.equals(“Open”)==true){…} 这个很好用 我的问题是,当我通过在XPath中包含文

在Selenium 2.37中,当我分两步搜索时,我可以单击上下文菜单中的“打开”项:

  • 通过搜索以下XPath查找一些WebElement:
  • td[@class=\“dijitmeneuitemlabel\”和“+”以(@id,\“dijit\u MenuItem\”)开头]

  • 然后,对于这个WebElement列表中的每个WebElement,我会 字符串s=we.getText();如果(s.equals(“Open”)==true){…}
  • 这个很好用

    我的问题是,当我通过在XPath中包含文本搜索“一步”完成上述操作时:

    td[@class=\“dijitReset dijitMenuItemLabel\”和“+ “以(@id,\“dijit\u MenuItem\”)和text()开头(=”Open\“]

    在这种情况下,我确实在上下文菜单中找到了“打开”条目,我可以单击它。到目前为止,一切顺利。因此,对于查找一次打开的条目并单击它一次,上述两种方法都可以很好地工作

    问题是,当我使用第二种方法时,下一次我想打开上下文菜单(对于不同的文档)并单击“打开”菜单项时,上下文菜单就会出现。但是鼠标不会向下移动到“打开”菜单项,因此不会发生单击

    这都是在单个WebDriver运行期间完成的,因此结果是我可以打开一个文档(我看到的第一个文档),它的上下文菜单出现,鼠标移动到打开上下文菜单项,然后单击它。但是(运行相同的WebDriver),当我进入第二个文档时,会出现右键单击,并显示上下文菜单,但鼠标不会向下移动到“打开”菜单项,因此不会发生单击

    当然,现在我使用的是第一种方法。但是我更喜欢使用第二种方法,因为如果所有内容(包括text()匹配)都在一个XPath表达式中,我可以在WebDriverWait中查找该元素

    当使用更复杂的XPath来查找打开的菜单项时,它就好像(不知何故)被销毁了,从DOM中分离了,或者其他什么

    我只对上下文菜单中的项目有这个问题


    任何建议都将不胜感激

    您没有发送问题的完整示例,但据我所知,您没有等待加载某些内容(特别是如果您在SPA上执行此操作,它是一些onClick绑定)。尝试第一种硬编码等待一秒钟的方法,如果它单击,那么您需要找到一种方法来检查打开的元素是否绑定了单击。您可以添加一些额外的等待时间,如:

    wait.until(ExpectedConditions.elementToBeClickable(By.id<locator>));
    
    wait.until(ExpectedConditions.elementtobelickable(By.id));
    

    此外,您还可以创建一些扩展的预期条件,将JavaScript注入浏览器并返回is click is bind。

    您说您可以“选择打开的条目”,但不能单击它。你选择它是什么意思?它是否以某种方式突出显示?感谢您的回复。我所说的“选择它”,是指运行的WebDriver代码选择了Open菜单项。但现在我又试了一次,那是不正确的。第二次实际发生的是上下文菜单出现。但是鼠标不会向下移动(在关联菜单中)到打开的项目。(这不同于第一次出现关联菜单时,鼠标向下移动到打开的项目,然后单击打开的项目。)我刚刚更新了原始问题。感谢宽恕森指出了我最初的错误。时间问题是Selenium的常见问题。也就是说,您试图使用xpath查找的项还不存在。此外,有时打开某个对象两次会在dom中创建两次,然后您无法确定它是否找到了可见的对象,而不是隐藏的旧对象(但仍在dom中)。这是我建议研究的两个常见问题。