【发布时间】:2021-01-08 18:26:36
【问题描述】:
我每晚通过 Jenkins 运行测试。大约 95% 的时间它都会过去。但有时它会失败:
driver.findElement(By.xpath("//div[contains(@id, 'stage')]/div[contains(@class, 'tabMenu')]/span[contains(@class, 'menuItem') and contains(text(),'Employer')]"))
带有 org.openqa.selenium.InvalidSelectorException。注意:这几乎总是有效的。
所以我使用 Eclipse、Java 和 Selenium 进行调试。同样,在出现此错误之前,我必须运行大约 30 次测试。
我正在使用 Selenium 和 IE。 IE 没有很好的调试功能,因此使用 Eclipse Debug Shell 我将页面源代码写入文件,将文件重命名为 html 文件并使用 Chrome 进行编辑。在检查窗口中,我搜索
//div[contains(@id, 'stage')]/div[contains(@class, 'tabMenu')]/span[contains(@class, 'menuItem') and contains(text(),'Employer')]
它会找到它并突出显示它。当我从调试外壳做一个
driver.findElement(By.xpath("//div[contains(@id, 'stage')]/div[contains(@class, 'tabMenu')]/span[contains(@class, 'menuItem') and contains(text(),'Employer')]"))
我明白了
org.openqa.selenium.InvalidSelectorException:Unable to locate an element ... because of the following error:
[object Error] (WARNING: The server did not provide any stacktrace information)
所以我想我会得到所有的 div 并得到他们的 ID:
driver.findElement(By.xpath("//div"))
我明白了
org.openqa.selenium.InvalidSelectorException: Unable to locate an element with the xpath expression //div because of the following error:
[object Error] (WARNING: The server did not provide any stacktrace information)
没问题。我尝试 driver.findElement(By.xpath("//*")) 仍然得到 InvalidSelectorException
所以“//*”必须找到元素。即使没有,它不应该返回类似 NoSuchElementException 而不是 InvalidSelectorException 的东西吗?有谁知道发生了什么?我进行了搜索以查找 InvalidSelectorException 的含义,并找到了用法但不是真正的定义。
所以我想我有两个问题:1. 为什么没有找到任何元素(甚至“//*”),以及 2. 它不应该返回 NoSuchElementException 而不是 InvalidSelectorExmaple?
【问题讨论】:
-
你给驱动程序一个相当混乱的 xpath...它混合了一个基于路径的选择器,指示某个 div 之后的第一个跨度(具有相对要求)和一个必须包含两个值的指令。找到一个不那么脆弱的 xpath 并可能在那里添加一个 webdriverwait ,因为这种情况有时会发生,这表明存在时间问题。发布您要定位的元素的 HTML。 (“//*”并没有真正指向任何特定元素,这可能是它返回无效的原因。这就像说“返回 1 个任何地方的任何元素”也许 findElements 会起作用......)
标签: selenium invalidselectorexception