使用 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
变量中的文本的<span>
元素。
【讨论】:
嗯,它确实适用于所有其他页面,所以这是一个修复:) 谢谢。现在我只需要点击隐藏的东西,我现在就试着研究一下。【参考方案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 标签之间单击文本的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Java 在 selenium webdriver 中打开新选项卡,或者如何使用 selenium webdriver 使用动作类在 selenium 中按 ctrl + T [重复]
如何使用selenium webdriver来判断一个网页加载完毕