为Selenium编写适当的Xpath:pre标签导致问题

时间:2015-02-12 00:00:36

标签: java selenium xpath

使用Selenium并尝试使用正确的xpath从pre标签中获取文本。

WebElement sequence = driver.findElement(By.xpath("//span[@id='MFE_sequence_span']/pre"));
WebElement structure = driver.findElement(By.xpath("//span[@id='MFE_structure_span']/pre"));
if(sequence.isDisplayed()) {
    System.out.println("sequence: " + sequence.getText());
    System.out.println("structure: " + structure.getText());
    break;
}

所以我已经进行了一些测试,它对其他标签起作用很简单,当最后一次" / pre"不存在,但是当我添加" / pre"我无法找到节点异常。到底发生了什么事?

这是html。真的很简单。是的,还有更多;这是嵌入式的,但它是唯一相关的部分。

<span id="MFE_sequence_span">
<pre>
1      AAAAA
</pre>
</span>

3 个答案:

答案 0 :(得分:0)

不要担心标签。只需使用xpath基于文本的搜索即可找到它。我总是发现在找到元素时跳过了很多问题。使用explicit等待,因为它是一个独立于标签的搜索,可能会进行较慢的搜索。

By byXpath = By.xpath("//*[.='1      AAAAA']");

WebElement myDynamicElement = (new WebDriverWait(driver, 10))
  .until(ExpectedConditions.presenceOfElementLocated(byXpath ));

修改

我可以建议的另一件事是使用JavaScript

//Just to make sure the previous tag is present
By byId = By.id("MFE_sequence_spa");
new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(byId));

WebElement myDynamicElement = (WebElement)((JavascriptExecutor)driver).executeScript("return document.querySelector('#MFE_sequence_span>pre');");
System.out.println(myDynamicElement.getText());

打印

1      AAAAA

答案 1 :(得分:0)

这可能是一个很长的镜头,但尝试用div替换跨度。

这是因为根据HTML规范,内联元素只能包含其他内联元素。由于span是内联的,pre是block,因此span内的pre是无效的HTML。

答案 2 :(得分:0)

好的,所以经过对我得到的来源的进一步分析后,brunobastosg是完全正确的。所有来源除了跨度内部的预标记已由网络驱动程序获取。但是,pre标签显然位于浏览器的页面源上。因此,我假设Selenium在我处理它之前正在“纠正”坏的html,从而造成了这种巨大的烦恼。

我将假设这是一个Selenium的东西并通过其他libs查看。好的部分是Selenium仍然有用,无论如何还有许多其他原因。我可能需要使用另一个库进行实际的html处理,其中至少有一些我可以查看。如果我能找到一个解决方案,我会回到这里。

修改

Saifur在他的编辑中得到了它。问题已解决。