0

我致力于使网站自动化,并试图找到一种方法来减少代码中 xpaths 的使用。我的代码看起来像这样

    driver.findElement(By.xpath("//html/body/center/div/div/center/table/tbody/tr/td/form/table/tbody/tr[3]/td/input")).click();
    driver.findElement(By.xpath("//html/body/div/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td")).getText();
    driver.findElement(By.xpath("//html/body/div/table/tbody/tr/td/div[2]/div/div/div[4]/div/div/div")).click();
    driver.findElement(By.xpath("//html/body/div[3]/div/div/div/div[2]/div/span/ul[2]/li[6]/a")).click();
    /*driver.findElement(By.xpath("//html/body/div/div/div/div[3]/div/div[2]/div[2]/table/tbody/tr/td[3]/table/tbody/tr/td[2]/em/button")).click();
    WebElement editUserForm = driver.findElement(By.cssSelector("iframe[src*='editUserForm']"));

有什么办法可以减少这些 xpath 以使我的代码看起来不破旧?这里的一位成员建议我“请不要使用绝对 xpath”。这是什么意思 ?请帮忙。如果有任何链接可以帮助我,也请告诉我。

是否可以创建一个文件,将字符串转换为 xpath 指针,然后我们可以在代码中使用该字符串?

4

2 回答 2

11

你应该投资页面对象,这是一个非常有用的模式:

https://code.google.com/p/selenium/wiki/PageObjects

它将有助于将测试与实现分开。我的意思是,测试应该详细说明所采取的步骤,实现(“页面对象”)应该详细说明如何采取这些步骤。

至于 XPath 本身,是的,它们非常糟糕且不可靠。我假设您已经通过某些工具(可能是 IDE 或 Firebug)为您自动生成了它们。现在请把它们扔掉,不要再使用它并阅读一些 XPath 教程——即使 XPath 规范也是一个很好的学习场所。

首先,放下//html/body钻头,它是不需要的,而且看起来更糟。没有它它会正常工作。

其次,是的,拥有绝对 XPath(即基于位置的 XPath)是不好的。在您的第一个 XPath 中:

//html/body/center/div/div/center/table/tbody/tr/td/form/table/tbody/tr[3]/td/input

看到那个决赛了tr[3]吗?如果我要在该行tr之前添加另一行 ( ) 怎么办?这意味着现在您的 XPath 应该是:

//html/body/center/div/div/center/table/tbody/tr/td/form/table/tbody/tr[4]/td/input

所以这意味着测试将中断。然而,测试不会因为它测试的功能被破坏而被破坏,它被破坏是因为测试实现被破坏了。你的测试不应该那么不稳定。如果开发人员想坚持一个tr高于你想要的那个,很好,除非它破坏了你正在测试的实际东西,那么你的测试应该仍然通过。

你应该换个角度思考。想想其他方法来达到那个元素。假设我有这个:

<div id="divUpload">
<span class="uploadDetails">We only support the following files:
    <span class="docSpan">.doc</span>
    <span class="txtSpan">.txt</span>
</span>
<button type="submit">Upload the file<submit>
<div>

我想获得跨度,docSpan因为它是类名。

我可以:

//div/span/span[1]

哪个会起作用,但是如果将其更改为:

<div id="divUpload">
<span class="uploadDetails">We only support the following files:
    <span class="excelSpan">.xls</span>
    <span class="docSpan">.doc</span>
    <span class="txtSpan">.txt</span>
</span>
<button type="submit">Upload the file<submit>
<div>

这意味着该[1]位不再有效。

所以,我可以:

//div/span[@class='uploadDetails']/span[text()='.doc']

span这意味着,只有当I want 不再是班级的孩子或uploadDetails 班级uploadDetails完全脱离班级时,它才会失败。

或者我可以:

//div/descendant::span[text()='.doc']

这意味着只有在跨度完全移动并且不再是该“父”div 的子级时才会失败。

底线是不要依赖职位。想想那个元素附近有什么。有课吗?里面有文字吗?附近有没有带身份证的东西?

于 2013-05-20T11:35:44.407 回答
0

这里又是 Y XPath Y 不要使用 CSS

css=.uploadDetails > .docSpan -- .doc

css=.uploadDetails > .excelSpan -- .xls

css=.uploadDetails > .txtSpan -- .txt

简单的

于 2014-04-03T09:22:49.527 回答