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,因为它一直在变化。我无法搜索元素的类,因为有多个可能会改变位置。
我希望能够点击&#34; WORDS&#34; 介于 SPAN标记之间。这有可能吗?
这是我到目前为止使用的,但似乎都不起作用:
//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();
}
答案 0 :(得分:5)
您可以通过文本选择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();
}
您可能还希望考虑等待元素出现,而不是声明明确的睡眠
答案 1 :(得分:3)
我怀疑该元素出现的时间超过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,我们只是试图模仿用户的工作方式。即使他/她必须等待元素出现以执行某些操作。
答案 2 :(得分:1)
尝试使用:
driver.findElement(By.xPath("//span[starts-with(., \"" + document + "\")]")).click();
它对我有用! 如果您想检查中间的某些文本,请尝试:
driver.findElement(By.xPath("//span[contains(., \"" + document + "\")]")).click();
答案 3 :(得分:1)
我认为没有理由说明xpath不能正常工作
driver.findElement(By.xpath("//span[contains(text(), \"" + document + "\")]"));
此外,您可能需要输入字符串为常量
//string document is words.
public void testscenario123(final String document) throws Throwable {
如果你要获得ElementNotVisibleException
,那么检查你的定位器是否正在返回正确的元素,也许还有另一个<span>
元素,其中包含document
变量中的文本。
答案 4 :(得分:-2)
我们可以使用xPath来查找这样的元素,因为文本位于span标记内。以下是代码段...
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();