【问题标题】:Writing a Proper Xpath for Selenium: pre Tag Causing Problems为 Selenium 编写正确的 Xpath:pre Tag 导致问题
【发布时间】:2015-02-12 00:00:36
【问题描述】:

使用 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>

【问题讨论】:

  • 您的要求是找到pre标签然后找到包含1 AAAAA或只是&lt;span id="MFE_sequence_span"&gt;的标签?
  • 获取包含 1 个 AAAA。但是我需要将 pre 标记作为 WebElement 来执行此操作,这样我才能获取它的文本。

标签: java selenium xpath


【解决方案1】:

那就不用担心标签了。只需使用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

【讨论】:

  • 没有骰子。这不是一个简单的刮擦。该内容是可变的。
  • @TomBurns 什么内容是可变的?
  • pre 标签的内容。 “1 AAAA”并不总是“1 AAAA”。这将是很多不同的事情。
  • 好的,然后 1. 文本未知,2. pre 标签并不总是存在。我说对了吗?
  • 1 是正确的。 2 不正确。这就是我使用 pre 标签来搜索该字符串的原因 - 它始终存在并且始终包含所需的字符串。
【解决方案2】:

这可能是一个长镜头,但尝试用 div 替换 span。

这是因为根据 HTML 规范,一个内联元素只能包含其他内联元素。由于 span 是内联的,而 pre 是块的,所以 span 内的 pre 不是有效的 HTML。

【讨论】:

  • 对不起,我没有说清楚。这不是我的html。这是一个我无法控制的网站。我无法改变它。所以你基本上是说我被他们碰巧写的方式搞砸了?
  • 其实我不确定。我明天上班时试试看。
【解决方案3】:

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

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

编辑

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

【讨论】:

  • 我为您提供了另一个编辑。以前从未处理过pre 标签,所以真的不知道发生了什么
  • 这很有趣,但是当我尝试通过构造函数启用 JS 时出现了问题。 WebDriver driver = new HtmlUnitDriver(true);当我这样做时,它试图从站点加载 javascript 并失败。还有其他激活JS的方法吗?
  • 顺便说一句,我不知道您使用的是HtmlUnitDriver。另外,众所周知,webdriver 的很大一部分是用javascript 编写的,所以如果javascript 不起作用,那么难怪这可能是原因之一。我建议您尝试使用ChromeDriverFirefoxDriver 看看是否可以重新创建问题
  • 工作。 Saifur,你有我最诚挚的谢意。哦,还有一件事——你知道我是否可以让 FirefoxDriver 在后台运行,而不是每次运行时都打开 gui?
  • 顺便说一下,我原来的 xpath 代码现在可以工作了。它实际上只是 HtmlUnitDriver。天哪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 2015-11-07
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多