有时xpath不起作用,但有时同样的xpath在运行自动化时工作

时间:2015-10-06 04:54:49

标签: selenium xpath selenium-webdriver webdriver xpath-2.0

我写了一个xpath,如下所示:

//div[contains(@id,'ext-element-')]/table[2]/tbody/tr/td/div/span

相同的xpath有时它会找到特定的元素。但有时它会抛出

  

ElementNotFoundException。

有没有方便的方法来解决这个问题?

4 个答案:

答案 0 :(得分:1)

xPath中的元素越多(例如tbody/tr/td/div),它破坏的可能性就越大(有时出于神秘的原因)。

尽可能使用descendant跳过它们,例如:

//div[contains(@id,'ext-element-')]/table[2]/descendant::span[contains(@id, 'spanId')]

或者只是双斜杠//(意思是任何子或子):

  //div[contains(@id,'ext-element-')]/table[2]//span[contains(@id, 'spanId')]

更短,是的,但不太可读(容易错过斜线,然后想知道发生了什么)。但仍然大多喜欢双斜线。

使用"轴名称"可以使您的xPath更健壮。

以下是一些资源:

http://seleniumworks.blogspot.de/2014/03/xpath-selenium-uses-part-ii.html

https://www.simple-talk.com/dotnet/.net-framework/xpath,-css,-dom-and-selenium-the-rosetta-stone/

http://www.guru99.com/xpath-selenium.html

答案 1 :(得分:0)

此前的步骤是否会导致对DOM的更改(例如,新页面加载或更改页面的AJAX请求)?如果是,那么很可能是一个计时问题:有时找不到元素,因为在页面加载时发生了对元素的请求。您应该等待元素存在。然后找到元素并做下一步。

答案 2 :(得分:0)

不确定这是否对您有很大帮助,但是我遇到了类似的问题,其中driver.find_element_by_xpath(...)最初将返回信息,但是几秒钟后再运行相同的操作将导致'Element Not Found'异常,因此我导入了时间,并将sleep(2)后面紧跟着driver.get(...),这对我来说是固定的。

希望有帮助。

答案 3 :(得分:-1)

总是试着走绝对路径;否则尝试通过向XPATH添加索引;否则选择相对路径的第三个选项(保持最小)。