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】:

这似乎没有 &lt;a&gt; &lt;/a&gt; 标记,因此 selenium 可能无法将其检测为链接。

您可以尝试使用

driver.findElement(By.xpath("//*[@class='ng-binding']")).click();

如果这是该页面中唯一具有此类的元素。

【讨论】:

它确实有一个&lt;a/&gt; 标签:&lt;a class="item" ng-href="#/catalog/90d9650a36988e5d013... 另外,我投反对票是因为您在此处指定的代码会单击&lt;strong /&gt;。单击&lt;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)

即使没有错误,也无法使用Selenium Webdriver注册零售网站