绝对 Xpath 不适用于 Gmail 登录页面

软件测试 硒2 路径
2022-01-16 00:01:14

我已经测试了 Gmail 登录页面,并试图验证 Gmail 登录页面中用户名字段上方的登录标签。我正在使用 FirePath 生成 Xpath。当我使用 Firebug 检查元素登录时,FirePath 生成了绝对 Xpath html/body/div[1]/div[2]/div[1]/div/h2当我复制这个 Xpath 并执行它时,测试用例失败了。添加//到绝对 Xpath 作品,即//html/body/div[1]/div[2]/div[1]/div/h2. 总而言之,绝对 Xpath 与/(单斜杠)一起使用,而相对 Xpath 与//. 谁能纠正我的错误或解释这一点?

4个回答

请尽可能避免使用绝对 xpath,页面布局的任何微小变化和您的 xpath 都可能变得完全无用,尽可能使用类名、id 等...对于 gmail 登录,

//div[@class='signin-box']//div[@class='email-div']//input[@id='Email'] 

是用户名文本字段的 xpath,同样是密码字段,它是

//div[@class='signin-box']//div[@class='passwd-div']//input[@id='Passwd']

根据我的经验,Selenium 读取 XPath 的方式有时与您的预期不同,特别是如果您已验证 XPath 在 Firepath 中是正确的。

是的,您发布的两个 XPath 都指向同一个元素并且应该以相同的方式工作,但由于某种原因,只有相对的 XPath 在 IDE 中正常工作。

主要的收获是避免像瘟疫一样的绝对 XPath始终使用相对的,但使它们更具体,因此找不到其他元素(因为 Selenium 会从所有匹配项中选择第一个)。

这很好很简短://div/h2. 但是,如果在此之前的页面上还有任何其他 h2 元素,它们也会被找到。

如果您想更精确,请尝试://div/h2[contains(text(),"Sign in")].

我用 Firepath 和 Selenium IDE 测试了上面的每一个,它们都可以工作。

您提到了启动 Xpath 的三种方法。 /html匹配文档顶部的 html 标签。 //html匹配文档中任何位置的任何 html 标签。 html匹配作为上下文元素子元素的任何 html 标记。我不知道 Selenium 2 如何定义上下文元素。如果上下文元素不是文档的顶部,您将获得观察到的行为。

如果您尚未阅读W3C Xpath 规范中关于位置和缩写的部分,您可能会从中受益。它不是很长。

我建议永远不要在任何 UI 测试中使用完整的 xpath。原因是如果 UI 结构发生任何变化,那么您的测试将失败。维护您的测试用例将花费巨大的成本。因此,对于任何 UI 测试,我们都应该尝试根据元素的唯一 id/class/div 名称等来识别元素。

对于您的情况来查找登录链接,您可以使用以下命令:

selenium.GetText("//div[@class='signin-box']/h2");

希望这会帮助你。