最近在运行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找到所需的元素,但无论我尝试在代码中使用哪个By(cssSelector,xpath,id等)都找不到元件。
这发生在多个页面上,但它们都是Visualforce页面。相同的代码在标准页面上运行而没有问题。这也仅适用于在Chrome中运行,我在Internet Explorer中运行相同的测试,并且Visualforce页面上没有任何问题。
我还使用了driver.getPageSource()来查看页面源代码,当我在Chrome中运行它时,返回的HTML与IE相比有所不同。
我有两个主要问题:
有没有其他人在Visualforce页面上看到类似的问题,其中简单的选择器无法找到WebElement(即使它绝对在页面上)?
为什么WebDriver会在IE中获取正确版本的HTML,但是在Chrome中获得不同的版本,有没有已知的原因?
答案 0 :(得分:0)
对于#1 - 所以当你在控制台中输入一个查询时,元素就在那里,但是当WebDriver运行那个查询时,它并不能保证它存在(它比我们的低级人类快得多)。等待等待它可见......但NoSuchElementException意味着该元素尚不存在。我会尝试等待presenceOfElementLocated。然后等待它可见,如果需要的话。
对于#2,可能(甚至可能)不同的浏览器从服务器接收不同的HTML并且WebDriver正常工作。
答案 1 :(得分:0)
今天进一步调查后,我已经弄清楚发生了什么。出于某种原因,WebDriver将其焦点转移到页面上的iframe。我知道这不是在代码中的某个地方完成的,因为它没有区分浏览器,它们都运行相同的代码而不检查它是否是ChromeDriver,InternetExplorerDriver等。
页面来源不同的原因是因为在Chrome中它只返回iframe中的源,而在Internet Explorer中它返回了整页源。
我通过在我的父页面对象的构造函数中调用方法driver.switchTo()。defaultContent()来解决这个问题,这样它总是最初从顶层开始(即使它应该这样做)开始)。
我不确定为什么只在Visualforce页面上发生这种情况,但这似乎可以解决它。