无法通过selenium web驱动程序中的By.linkText找到元素 去 点击我的帐户链接 单击创建帐户链接并填写除电子邮件ID之外的新用户信息

无法通过selenium web驱动程序中的By.linkText找到元素 去 点击我的帐户链接 单击创建帐户链接并填写除电子邮件ID之外的新用户信息,selenium,selenium-webdriver,selenium-firefoxdriver,Selenium,Selenium Webdriver,Selenium Firefoxdriver,您好。以上是我的测试用例。无法为帐户链接创建xpath 以下是我尝试过的脚本: WebDriver Driver=new FirefoxDriver(); Driver.get("http://live.guru99.com/"); WebElement element=Driver.findElement(By.linkText("My Account")); element.click(); 如果有人帮助我,那就太好了 提前感谢。没有“我的帐

您好。以上是我的测试用例。无法为帐户链接创建xpath

以下是我尝试过的脚本:

WebDriver Driver=new FirefoxDriver();                 
Driver.get("http://live.guru99.com/");
WebElement element=Driver.findElement(By.linkText("My Account"));       
element.click();
如果有人帮助我,那就太好了


提前感谢。

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

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


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

我确实有过我认为应该起作用的定位器不起作用的时候。对我来说,这也是其中之一。所以我尝试了一些其他的方法。这对我很有用:

    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();

您的代码几乎正确
但是,
By.linkText
可以在网站上用眼睛看到的链接文本上工作(在所有CSS应用之后

如果您查看一下,您将看到您正在搜索的链接是大写的:

“我的账户”

但你试图找到“我的账户”

因此,只需将代码中的第三行更改为:

WebElement element=Driver.findElement(By.linkText("MY ACCOUNT")); 
一切都应该很好

小心! 我看到人们用以下代码回答:

Driver.findElement(By.xpath("//a[@title='My Account']"))
System.out.println(Driver.findElements(By.xpath("//a[@title = 'My Account']")).size());
这很危险!为什么?因为有两个元素适合这个findElement查询!!通过运行以下代码自行检查:

Driver.findElement(By.xpath("//a[@title='My Account']"))
System.out.println(Driver.findElements(By.xpath("//a[@title = 'My Account']")).size());
这个返回2!(第一个链接直接显示为“我的帐户”,如果单击“帐户”,则可以看到另一个链接,然后在下拉列表中显示另一个链接为“我的帐户”。两个链接的标题相同,但元素不同)

幸运的是,在这种情况下,两种元素都会将您带到相同的理想位置

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

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

更安全 假设有一天,这个guru99站点决定对两个链接都使用大写。那么这个答案的方法也会受到这个问题的影响

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

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


Use和WebElement=Driver.findElement(By.linkText(“Account”);试试这个-
WebElement=Driver.findElement(按.className(“跳过帐户”))当我使用此xpath时,它指向account下的我的帐户。bt我的测试用例是单击页面底部的我的帐户。既有帐户,也有我的帐户链接。问题是关于我的帐户链接。这是不正确的!因为站点上有两个元素符合您的条件,所以获得正确的元素纯粹是运气->尝试一下,您就会明白:System.out.println(Driver.findElements(By.xpath(//a[@title='My Account'])).size();这确实导致了两个因素。这取决于你想点击哪一个:)如果你想点击第二个链接,请使用://*[@class='footer-container']//a[@title='My Account'],否则你需要访问帐户菜单中的第一个我的帐户链接://*[@class='page-header-container']//a[@title='My Account']@himaja太好了,不客气。既然这解决了你的问题,也许你会选择它作为答案?(点击复选标记)谢谢@himajas定位器工作得很好!但是你需要使用链接文本,就像你在网站上看到的那样(在所有的CSS应用之后),而不是像HTML代码中那样。所以他的代码行是大写的Driver.findElement(By.linkText(“我的帐户”);同样有效expected@EGHM请注意,您的第二个findElement适合站点上的两个元素!。。。这很有趣,因为如果你看HTML,它的大小写是混合的。正是CSS使其成为大写。另一种方法是查找title=“我的帐户”。@JeffC如果你读了我的答案,那正是我所说的!如果您使用“By.linkText”,则不应使用!查看HTML代码,但在应用所有CSS后,查看您在站点上看到的内容。由于OP怀疑他的“By.linkText”不起作用,这是因为他没有搜索大写字母linkText@JeffC为什么我会幸运?请你解释一下好吗?我的查询只返回了一个元素,但JordRoss的查询返回了两个元素。我不明白你的意思。@himaja很高兴能帮上忙@drkthng你是对的。。。我用javascript浏览页面,查看实际的HTML,发现有一个隐藏的链接,它具有相同的链接文本,可以生成两个链接。我当时没有想到Selenium只会看到一个。因此,只要页面的状态没有改变并显示其他链接,您就不幸运了……;)