【问题标题】:unable to find element via By.linkText in selenium web driver无法通过 Selenium Web 驱动程序中的 By.linkText 找到元素
【发布时间】:2015-12-16 03:05:46
【问题描述】:
  1. 转到http://live.guru99.com/
  2. 点击我的帐户链接
  3. 点击创建帐户链接并填写除电子邮件 ID 以外的新用户信息。

嗨..上面是我的测试用例。无法为帐户链接创建 xpath。

这是我尝试过的脚本:

WebDriver Driver=new FirefoxDriver();                 
Driver.get("http://live.guru99.com/");
WebElement element=Driver.findElement(By.linkText("My Account"));       
element.click();

如果有人帮助我,那就太好了。

提前致谢。

【问题讨论】:

标签: selenium selenium-webdriver selenium-firefoxdriver


【解决方案1】:

您的代码几乎正确
但是By.linkText 可以处理您在网站上看到的链接文本在应用所有 CSS 之后)。

如果您查看http://live.guru99.com/,您会发现您正在搜索的链接是大写字母

“我的帐户”

但您试图找到“我的帐户”。

所以只需将代码中的第三行更改为:

WebElement element=Driver.findElement(By.linkText("MY ACCOUNT")); 

一切都应该正常工作!

小心!

我看到人们使用以下代码回答:

Driver.findElement(By.xpath("//a[@title='My Account']"))

这很危险!为什么?因为有两个元素适合这个 findElement 查询!!通过运行以下代码自行检查:

System.out.println(Driver.findElements(By.xpath("//a[@title = 'My Account']")).size());

这将返回 2! (第一个链接直接显示为“我的帐户”,如果您单击“帐户”,则可以看到另一个链接,然后在下拉列表中有另一个链接显示为“我的帐户”。两个链接具有相同的标题但是不同的元素)。

我们很幸运,在这种情况下,这两个元素都会将您带到相同的所需位置。

但是根据我的经验,通常情况并非如此。在许多写得不好的网站上,您有多个具有相同标题的元素,那么如果这种查询返回的元素返回了您想要的元素,那纯属运气。

因此,最好使用“findElements”检查有多少元素适合您的查询。

更安全

假设有一天这个 guru99 网站决定对两个链接都使用大写字母。那么这个答案的方法也会遇到这个问题。

这就是为什么使用另一个定位器来缩小链接搜索范围的好策略。

分析我会选择“页脚”的网站:

WebElement footer=Driver.findElement(By.className("footer")); 
WebElement link=footer.findElement(By.linkText("MY ACCOUNT")); 

【讨论】:

  • ...这很有趣,因为如果您查看 HTML,它是大小写混合的。是 CSS 使它变为大写。另一种方法是查找 title="My Account"。
  • @JeffC 如果您阅读了我的回答,那正是我所说的!如果你使用“By.linkText”你不应该!查看 HTML 代码,但在应用了所有 CSS 后,查看您在网站上看到的内容。由于 OP 想知道他的“By.linkText”不起作用,这是因为他没有搜索大写的 linkText
  • @JeffC 为什么我很幸运?你能解释一下吗?我的查询只返回了一个元素,但 JordRoss 的查询返回了 2 个元素。我不明白你的意思。
  • @himaja 很高兴为您提供帮助!
  • @drkthng 你是对的......我正在使用 javascript 浏览页面并查看实际的 HTML,发现有一个隐藏的链接具有相同的 LinkText,可以创建 2 个链接。我当时并没有想到 Selenium 只会看到那个。因此,只要页面的状态没有改变并显示其他链接,您就不会幸运... ;)
【解决方案2】:

我当然有过我认为应该工作的定位器不工作的时候。这也是我的案例之一。所以我尝试了其他一些事情。这对我有用:

    WebDriver Driver=new FirefoxDriver();
    Driver.get("http://live.guru99.com/");
    Driver.findElement(By.xpath("//a[@data-target-element='#header-account']")).click();
    Driver.findElement(By.xpath("//a[@title='My Account']")).click();

【讨论】:

  • @himaja 太好了,不客气。既然这解决了您的问题,也许您会愿意选择它作为答案? (通过单击复选标记。)谢谢!
  • @EGHM:himajas 定位器工作正常!但是需要使用您在网站上看到的链接文本(在应用所有 CSS 之后),而不是在 HTML 代码中。所以他的代码行大写 Driver.findElement(By.linkText("MY ACCOUNT"));按预期工作
  • @EGHM 请注意,您的第二个 findElement 适合网站上的两个元素!
【解决方案3】:

WebElement element = Driver.findElement(By.xpath("//a[@title='My Account']"));

【讨论】:

  • 这是不正确的!因为网站上有两个元素满足你的条件,所以找到合适的元素纯属运气 -> 试试这个你就会明白: System.out.println(Driver.findElements(By.xpath("//a[@ title = '我的帐户']")).size());
  • 这确实会产生两个元素。这取决于您要单击哪一个 :) 如果要单击第二个链接,请使用: //*[@class='footer-container']//a[@title='My Account'] 否则,您需要访问“帐户”菜单中的第一个“我的帐户”链接://*[@class='page-header-container']//a[@title='My Account']
【解决方案4】:

没有“我的帐户”链接,而是“帐户”。所以,改变 -

WebElement element=Driver.findElement(By.linkText("My Account"));

到 -

WebElement element=Driver.findElement(By.linkText("Account"));       

【讨论】:

  • WebElement element=Driver.findElement(By.linkText("Account"));
  • 试试这个 - WebElement element=Driver.findElement(By.className("skip-account"));
  • 当我使用这个 xpath 时,它指向我在 account.bt 下的帐户。bt 我的测试用例是点击页面底部的我的帐户。
  • 有一个帐户和一个我的帐户链接。问题是针对“我的​​帐户”链接的。
猜你喜欢
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
  • 2020-12-29
  • 2019-09-20
  • 2020-09-30
  • 2023-04-04
  • 1970-01-01
相关资源
最近更新 更多