WebDriver通过xPath查找元素,没有TIMEOUT如果找不到元素,屏幕就会挂起。

时间:2013-01-22 09:05:42

标签: selenium webdriver selenium-webdriver xpath

由于我的测试语句无法找到该元素,我面临一些问题,即测试只是挂在那里(浏览器打开而无法继续下一次测试)。

我的TestStatemet是这样的:

driver.findElement(By.xpath("//input[@name='AID' and contains(@value,'sampleDataThatwillNotFound')]"));

只有在通过XPATH查找时才会挂起测试,在通过NAME / ID查找时没有问题。我已将超时设置为60秒,在60秒之后,它仍然挂起。

之前有人面对这个问题吗?或者任何人都知道如何解决这个问题?

5 个答案:

答案 0 :(得分:4)

好吧,我遇到了同样的问题,并在 webdriver api doc 中找到了这个问题: 不应使用findElement来查找不存在的元素,而是使用findElements(By)并声明零长度响应。

所以我使用类似

的东西
List<WebElement> found = driver.findElements(By.id("elementid"));
if (found.size() > 0) 
{
    // get the 1st element
} else {
    // time out
}

解决此问题。在我的情况下,隐式超时适用于findElements

答案 1 :(得分:0)

试试这个定位器

driver.findElement(By.xpath("//input[@name='AID'][contains(@value,'sampleDataThatwillNotFound')]"));

答案 2 :(得分:0)

我收到了来自Google网上论坛的darrell的反馈,我同意他的意见,下面是他的反馈意见: https://groups.google.com/forum/#!topic/webdriver/Vt0DuQHOAg8

* 我没有看到这些定位器悬挂,但一切皆有可能。 通常,如果DOM是大型和/或复杂的组合定位器 (一个包含加上一个和)可能会让它变得非常慢。我的将军 经验越长,定位器就越复杂。 花费的时间越长,你就越有可能看到一个 NoSuchElementException异常。这可能是你正在做的其他事情 导致第二个问题,即悬挂。 和声明是多重的。所以@ name ='AID'相对较快。 没有子字符串检查。它要么匹配要么不匹配。所以 此定位器将按顺序n运行,其中n是输入标记的数量。 像contains(@ value,'someString')这样的定位器必须扫描每个 每个属性的标记,用于匹配每个可能的子字符串。如果 contains()实现得好,它可能比粗暴要快一些 强制但DOM中的数据类型将决定这个多长时间 搜索将采取。肯定会很慢。 现在,如果你采取contains()搜索(相对慢)和确切 匹配(相对较快)然后寻找两个匹配的AND,你 将它们相乘。两次完全匹配将是n次 n(或n平方)。这个不好。完全匹配时间a 包含真的很糟糕。根据DOM,它可以是n阶 立方。这意味着如果n需要10秒,则n立方为10 * 10 * 10 秒(1000秒或超过16分钟)。如果DOM导致事情发生 更糟糕的是,你可以看到完全匹配是秒和 组合是几小时。 达雷尔*

因此,为了解决这个问题,我认为是时候强制开发团队应用于通用开发实践,为每个元素/控件添加唯一的id。这样测试自动化脚本可以通过ID直接执行任何验证/输入,而不是xPath。

答案 3 :(得分:0)

我上面已经尝试了一些答案,但仍然有相同的问题..我切换回旧的Firefox版本17.0.3 ....一切只是解决.. abit搞笑..那些面临同样的问题你可以尝试FF版本17.0.3

答案 4 :(得分:0)

升级Firefox(25到26)和Selenium(2.37.1到2.39.0驱动程序+服务器)后,我遇到了同样的问题。没有异常抛出,永远挂起等等。它通过删除implicitlyWait声明得到了“解决”。不是一个真正的解决方案,但在我的情况下足够好。