Selenium WebDriver 无法通过链接文本找到元素
Posted
技术标签:
【中文标题】Selenium WebDriver 无法通过链接文本找到元素【英文标题】:Selenium WebDriver can't find element by link text 【发布时间】:2013-12-21 06:08:00 【问题描述】:我正在尝试选择一个包含锚点的元素,但文本隐藏在 div 内的段落中。这是我正在使用的 html:
<a class="item" ng-href="#/catalog/90d9650a36988e5d0136988f03ab000f/category/DATABASE_SERVERS/service/90cefc7a42b3d4df0142b52466810026" href="#/catalog/90d9650a36988e5d0136988f03ab000f/category/DATABASE_SERVERS/service/90cefc7a42b3d4df0142b52466810026">
<div class="col-lg-2 col-sm-3 col-xs-4 item-list-image">
<img ng-src="csa/images/library/Service_Design.png" src="csa/images/library/Service_Design.png">
</div>
<div class="col-lg-8 col-sm-9 col-xs-8">
<div class="col-xs-12">
<p>
<strong class="ng-binding">Smoke Sequential</strong>
</p>
我用来尝试阻止它的代码是针对“烟雾序列”文本:
driver.findElement(By.linkText(service)).click();
变量“服务”在其中包含“烟雾序列”。当我运行它时,我收到以下错误:
org.openqa.selenium.NoSuchElementException: Unable to locate element: "method":"link text","selector":"Smoke Sequential"
任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:这似乎没有 <a> </a>
标记,因此 selenium 可能无法将其检测为链接。
您可以尝试使用
driver.findElement(By.xpath("//*[@class='ng-binding']")).click();
如果这是该页面中唯一具有此类的元素。
【讨论】:
它确实有一个<a/>
标签:<a class="item" ng-href="#/catalog/90d9650a36988e5d013...
另外,我投反对票是因为您在此处指定的代码会单击<strong />
。单击<strong /
> 不会呈现任何内容,除非应用程序特别希望用户单击强烈,但由于它包含在超链接中,因此这里不是这种情况。
原帖说他们想点击“Smoke Sequential”链接,而不是sn-p第一行的。
锚点是需要点击的。我没有包含锚点的结束标签,因为还有一堆其他 div 只会占用空间,但它就在那里。它也不是唯一带有 ng-binding 标签的元素。它不在一个可能有几十个甚至几百个深度的列表中。
对不起,让我再试一次:我只需要一个可点击的元素。由于其他标识符是以我无法跟踪的方式创建的,因此我要提前知道的命名的恰好是唯一一个。【参考方案2】:
CSS 选择器方法绝对可以在这里工作。试试:
driver.findElement(By.CssSelector("a.item")).Click();
如果在这个类项目之前有其他锚点,这将不起作用。如果您执行“#my_table > a.item”之类的操作,您可以更好地指定确切的元素,其中 my_table 是锚是其子表的表的 ID。
【讨论】:
它不一定是第一个。该项目列表根据填充到其后面的数据库中的内容而有所不同。 a.item 也不是它独有的。该课程将与列表中的每个项目共享。发布的描述符,在本例中为“烟雾序列”,是该项目的唯一独特方面。 字符串输入的格式可能不正确,但是类似: driver.findElement(By.cssSelector("strong:contains(\"" + service + "\")")) .click(); 遗憾的是,它不是。 strong 标签中的文本是整个树中唯一真正独特的东西。 CSS 选择器可能帮不了你。特别是如果您尝试单击的链接的位置如您所说的那样不稳定。当您知道在 html 中的何处查找时,CSS 选择器是最好的选择。【参考方案3】:使用 xpath 和 text()
driver.findElement(By.Xpath("//strong[contains(text(),'" + service +"')]"));
【讨论】:
我会这样做,除了指定一个锚标记,而不是强 - driver.findElement(By.Xpath("//a[contains(text(),'" + service +"') ]"));【参考方案4】:问题可能出在 html 的其余部分,即您未发布的部分。
用这个例子(我刚刚关闭了打开的标签):
<a class="item" ng-href="#/catalog/90d9650a36988e5d0136988f03ab000f/category/DATABASE_SERVERS/service/90cefc7a42b3d4df0142b52466810026" href="#/catalog/90d9650a36988e5d0136988f03ab000f/category/DATABASE_SERVERS/service/90cefc7a42b3d4df0142b52466810026">
<div class="col-lg-2 col-sm-3 col-xs-4 item-list-image">
<img ng-src="csa/images/library/Service_Design.png" src="csa/images/library/Service_Design.png">
</div>
<div class="col-lg-8 col-sm-9 col-xs-8">
<div class="col-xs-12">
<p>
<strong class="ng-binding">Smoke Sequential</strong>
</p>
</div>
</div>
</a>
我能够毫无问题地找到元素:
driver.findElement(By.linkText("Smoke Sequential")).click();
如果元素内的文字较多,可以尝试通过部分链接文字查找:
driver.findElement(By.partialLinkText("Sequential")).click();
【讨论】:
这是我最终使用的。结果是 partialLinkText 抓住了它,原因我想不通,也不想浪费时间。感谢大家! :-) 在我的情况下,它不是部分链接,但链接的文本有一个空格。 trim() 解决了这个问题。 Firefox的驱动似乎也可以容忍这样的空间,但Chrome不接受。【参考方案5】:find_elements_by_xpath("//*[@class='class name']")
是一个很好的解决方案
【讨论】:
以上是关于Selenium WebDriver 无法通过链接文本找到元素的主要内容,如果未能解决你的问题,请参考以下文章
无法通过 perl 绑定连接 selenium webDriver
基于python实现UI自动化3.0 selenium - webdriver常见8大元素定位
Python selenium无法通过ID或xpath填写输入框。
是否存在无法检测到的 Selenium WebDriver 版本?
在 Firefox 量子浏览器上通过 Selenium Webdriver 运行脚本时无法单击 Flash 对象(版本:59.0.3)