Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为Selenium编写正确的Xpath:pre标记导致问题_Java_Selenium_Xpath - Fatal编程技术网

Java 为Selenium编写正确的Xpath:pre标记导致问题

Java 为Selenium编写正确的Xpath:pre标记导致问题,java,selenium,xpath,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()) {

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

1 AAAAA

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

//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());
编辑

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

1      AAAAA
印刷品


这可能不太可能,但请尝试用div替换span


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

好的,所以在进一步分析我得到的源代码之后,brunobastosg是完全正确的。除了span中的pre标记外,所有源代码都是由web驱动程序获取的。但是,pre标记显然在我的浏览器的页面源代码中。因此,我假设Selenium在处理坏html之前就“纠正”了它,从而产生了这种巨大的麻烦

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

编辑


塞福尔在他的编辑中得到了它。问题解决了

您的要求是先找到
pre
标记,然后找到包含
1 AAAA的标记
,或者只找到包含1 AAAA的标记。但是我需要把pre标签作为一个WebElement来做,这样我才能得到它的文本。这不是一个简单的擦伤。该内容是可变的。@TomBurns什么内容是可变的?pre标记的内容。“1 AAAAA”并不总是“1 AAAAA”。它会有很多不同的东西。好吧,那么1。文本未知且为2
pre
标记并不总是存在。我说得对吗?1是对的。2是不正确的。这就是为什么我使用pre标记来搜索该字符串-它总是在那里并且总是包含所需的字符串。很抱歉,我没有说清楚。这不是我的html。这是一个我无法控制的网站。我不能改变它。所以你基本上是说我被搞砸了是因为他们写的方式?事实上我不确定。明天我会在工作中测试它。我给你提供了另一个编辑。以前从未处理过
pre
标记,所以不知道发生了什么这很有趣,但当我试图通过构造函数启用JS时,出现了一些问题。WebDriver驱动程序=新的HtmlUnitDriver(true);当我这样做时,它试图从站点加载javascript,但失败了。还有其他方法激活JS吗?顺便说一句,我不知道你正在使用
HtmlUnitDriver
。另外,正如我们都知道的,
webdriver
的很大一部分是用
javascript
编写的,因此如果
javascript
不起作用,那也难怪这可能是原因之一。我建议您尝试使用
ChromeDriver
FirefoxDriver
,看看是否可以重新创建issueWorking。赛弗,我衷心感谢你。哦,还有一件事——你知道我是否可以让FirefoxDriver在后台运行,而不是每次运行时都打开gui?顺便说一下,我原来的xpath代码现在可以运行了。它实际上只是一个HtmlUnitDriver。哎呀。
1      AAAAA