使用 Selenium Webdriver (java) 在 SPAN 标签之间单击文本

Posted

技术标签:

【中文标题】使用 Selenium Webdriver (java) 在 SPAN 标签之间单击文本【英文标题】:Clicking on text in between SPAN tags using Selenium Webdriver (java) 【发布时间】:2014-04-04 12:17:33 【问题描述】:

html 代码如下所示:

<td id="id26a" class="doclisting-name link" style="width: 319px; min-width: 319px;"> 

<span id="id26b" title="Document">
<span class="ie-fallback-marker">
  words

</span></span></td>

我无法搜索元素 ID,因为它一直在变化。我无法搜索元素的类,因为有多个可能会改变位置。

我希望能够在 SPAN 标签之间点击“WORDS”。这有可能吗?

这是我目前使用的,但似乎都不起作用:

//string document is words.
   public void testscenario123(String document)      throws Throwable 
    Thread.sleep(3000);
    driver.findElement(By.linkText(document)).click();

  //string document is words.
 public void testscenario124(String document) throws Throwable 
    Thread.sleep(3000);
    driver.findElement(By.xpath("//*[contains(@span,'"+document+"')]")).click();

【问题讨论】:

你遇到了什么错误? 元素当前不可见,因此可能无法与之交互。和之前一样。我认为这可能是程序没有响应正确的代码,而不是给出的解决方案...... 【参考方案1】:

您可以通过文本选择 xpath,而 normalize-space 将去除空白:

  //string document is words.
 public void testscenario124(String document) throws Throwable 
    Thread.sleep(3000);
    driver.findElement(By.xpath("//*[normalize-space()='"+document+"']")).click();

您可能还希望考虑等待元素出现而不是声明显式睡眠

【讨论】:

不幸的是也无济于事...关于睡眠,我也考虑过,但是 waitforelementpresent 会导致一段荒谬的代码。我们还有一个 DoD 声明页面需要在 3 秒内加载... 啊,刚刚意识到,您需要将xpath更改为; //span[包含(@class, 'ie-fallback-marker') 和 normalize-space()='words']。我也很感兴趣,为什么等待会成为“荒谬的代码”? 奇怪的是,成功了!太感谢了!只是对一件事感到好奇:“单词”没有任何白色,那么为什么元素需要“删除白色”? 被空白包围 实际上,这是一个错字...真实代码周围没有空格,但不知何故您的解决方案可以解决问题:)【参考方案2】:

我怀疑元素出现的时间超过 3 秒。因此引发了以下异常。

元素当前不可见,因此可能无法与之交互

为避免此异常,必须使用implicit or explicit wait。

new WebDriverWait(driver,10).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//span[contains(., \"" + document + "\")]"))).click();

正如 RobbieWareham 所提到的,即使我也有兴趣了解更多关于这个waiting makes a ridiculous piece of code?

通过 Selenium Webdriver,我们只是试图模仿用户的工作方式。即使他/她也必须等待元素出现才能执行某些操作。

【讨论】:

我必须自动化 Hippo CMS。它在左侧有一个基本的地图结构。单击某个目录会打开主框架上的文档列表。在那个框架中,我希望 selenium 单击某种类型的文档。当我在脚本停止时检查元素时,它不会显示可点击的链接,但会在屏幕上显示它。我相信 Hippo CMS 是由 javascript 和小部件生成的,它们非常适合使用。【参考方案3】:

试试这个:

driver.findElement(By.xPath("//span[starts-with(., \"" + document + "\")]")).click();

它对我有用! 如果您想检查中间的一些文本,请尝试:

driver.findElement(By.xPath("//span[contains(., \"" + document + "\")]")).click();

【讨论】:

元素当前不可见,因此可能无法与之交互。不幸的是,它不起作用:/【参考方案4】:

我看不出遵循 xpath 不起作用的原因

driver.findElement(By.xpath("//span[contains(text(), \"" + document + "\")]"));

另外,您可能需要输入字符串保持不变

//string document is words.
   public void testscenario123(final String document)      throws Throwable 

如果您要获取ElementNotVisibleException,然后检查您的定位器是否返回正确的元素,可能存在另一个包含document 变量中的文本的&lt;span&gt; 元素。

【讨论】:

嗯,它确实适用于所有其他页面,所以这是一个修复:) 谢谢。现在我只需要点击隐藏的东西,我现在就试着研究一下。【参考方案5】:

我们可以使用 xPath 来查找这样的元素,因为文本在 span 标签内。下面是代码sn-p...

WebElement elmnt=driver.findElement(By.xpath(".//*[@id='MainLayout']/div/div[2]/div/div/div[3]/div/div[2]/div/div/div/div/div[2]/div/div/div[2]/div/div[2]/div/div/div[3]/div/div[2]/div/div/div[1]/div/div/div/div/div/div[4]/span/span"));

elmnt.click(); 

【讨论】:

以上是关于使用 Selenium Webdriver (java) 在 SPAN 标签之间单击文本的主要内容,如果未能解决你的问题,请参考以下文章

python selenium模拟滑动操作

Selenium Grid操作使用指南

如何使用 Java 在 selenium webdriver 中打开新选项卡,或者如何使用 selenium webdriver 使用动作类在 selenium 中按 ctrl + T [重复]

如何使用selenium webdriver来判断一个网页加载完毕

Selenium & webdriver.io 如何使用 executeScript?

Selenium WebDriver的使用