【问题标题】:Sometimes xpath is not working but sometimes same xpath is working while running automation有时 xpath 不工作,但有时相同的 xpath 在运行自动化时工作
【发布时间】:2015-10-06 04:54:48
【问题描述】:

我写了一个如下的xpath:

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

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

ElementNotFoundException。

有没有什么方便的方法可以解决这个问题?

【问题讨论】:

  • 请发布您的 HTML 代码,以便更容易理解问题。
  • 这个OP过去也从不分享HTML代码,甚至询问了太多次

标签: selenium xpath selenium-webdriver webdriver xpath-2.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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      不确定这是否对您有很大帮助,但我遇到了类似的问题,driver.find_element_by_xpath(...) 最初会返回信息,但几秒钟后运行相同的东西会导致 'Element Not Found' 异常,所以我导入有时间在我的driver.get(...) 后面加上一个sleep(2),这就为我修好了。

      希望对您有所帮助。

      【讨论】:

        【解决方案4】:

        始终尝试使用绝对路径;否则尝试向 XPATH 添加索引;否则选择相对路径的第三个选项(保持最小)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-29
          • 1970-01-01
          • 1970-01-01
          • 2011-12-06
          • 2020-12-12
          相关资源
          最近更新 更多