Java/WebDriver 元素存在但未在 Chrome Visualforce 中找到

Java/WebDriver element exists but not found in Chrome Visualforce

最近,在 运行 测试 WebDriver 时,我开始收到 TimeoutExceptions,即使我知道该元素存在于网页上。这是一个代码示例:

// Wait for page to be partially setup
    wait.until(visibilityOfElementLocated(By.id("bodyCell")));

这是我正在寻找的元素的一些周围 HTML:

</div></td>
<td class="oRight" id="bodyCell">
<!-- Start page content -->
<a name="skiplink"><img src="/s.gif" height='1' width='1' alt="Content Starts Here" class="skiplink skipLinkTargetInner zen-skipLinkTarget" title="Content Starts Here"/></a>

我已经使用了 Chrome 控制台并确认我能够使用 CSS 找到所需的元素,但无论通过(cssSelector、xpath、id 等)我尝试在代码中使用它不会找到该元素。

这发生在多个页面上,但它们都是 Visualforce 页面。标准页面上的相同代码 运行s 没有问题。这也仅适用于 Chrome 中的 运行ning,我在 Internet Explorer 中 运行 进行了相同的测试,并且在 Visualforce 页面上没有任何问题。

我还使用 driver.getPageSource() 查看页面源代码,当我 运行 在 Chrome 中比较时返回的 HTML 是不同的到 IE。

我有两个主要问题:

  1. 有没有其他人在 Visualforce 页面上看到类似的问题,其中简单的选择器无法找到 WebElement(即使它绝对在页面上)?

  2. 是否有任何已知原因导致 WebDriver 在 IE 中获得 HTML 的正确版本,但随后在 Chrome 中获得不同的版本?

对于 #1 - 因此当您在控制台中输入查询时该元素已经存在,但这并不能保证它在 WebDriver 运行该查询时存在(它比我们低级人类快得多) .您正在等待它可见……但 NoSuchElementException 暗示该元素尚不存在。相反,我会尝试等待 presenceOfElementLocated。然后等待它可见,如果需要的话。

对于 #2,不同的浏览器可能(甚至可能)从服务器接收到不同的 HTML 并且 WebDriver 工作正常。

今天进一步调查后,我弄清楚了发生了什么。出于某种原因,WebDriver 将其焦点切换到页面上的 iframe。我知道这不是在代码中的某个地方完成的,因为它不区分浏览器,它们都是 运行 相同的代码而不检查它是否是 ChromeDriver、InternetExplorerDriver 等

页面源代码不同的原因是,在 Chrome 中,它只返回 iframe 内的源代码,而在 Internet Explorer 中,它返回完整的页面源代码。

我通过在我的父页面对象的构造函数中调用方法 driver.switchTo().defaultContent() 来解决这个问题,这样它总是最初从顶层开始(即使它应该'一开始就这样做了)。

我不确定为什么这只发生在 Visualforce 页面上,但这似乎可以适当地修复它。