我正在尝试获取一个分别命名为text1,text2,text3,text4的文本。
<div class="element">
<p><span>"TEXT1"</span></p>
<p><span>"TEXT2"<br>"TEXT3"<br>"TEXT4"</span</p>
</div>
当我尝试将div.element>p>span
与css选择器一起使用时,硒会抛出nullpointer异常。
WebElement element = driver.findElement(By.cssSelector("div.element>p>span"));
String a = element.getText();
System.out.println("a : "+a);
我也试图让它们带有for循环,但是没有用。你能帮我吗?
答案 0 :(得分:0)
您可以尝试以下“ div> p> span”
答案 1 :(得分:0)
首先尝试使用xpath
更改您的定位器:
By.xpath("//*[@class='element']//p")
然后将它们收集在List
中,使用循环并将其与换行符分开。
List<WebElement> elements = driver.findElements(By.xpath("//*[@class='element']//p"));
for(int i=0; i<elements.size(); i++) {
WebElement p = elements.get(i);
String lines[] = p.getText().split("\\r?\\n");
for(String line: lines) {
System.out.println("line :" +line);
}
}
答案 2 :(得分:0)
空指针异常意味着您正在尝试从不存在的元素中获取文本。因此,您首先要确保找到了元素,然后尝试对其进行处理。
此外,由于您的文本由不同的标记分开,因此无法在此处编写通用循环。我建议您将div容器中的所有文本都放在一个字符串中,该文本将是文本,并用特殊符号(例如/ r / n或类似符号)分隔。然后,您可以使用Regex将此字符串拆分为所需的字符串。
答案 3 :(得分:0)
要逐个提取文本 TEXT1 , TEXT2 , TEXT3 和 TEXT4 ,可以使用以下命令XPaths:
TEXT1 :
System.out.println(new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='element']/p/span"))).getAttribute("innerHTML"););
TEXT2 :
System.out.println(((JavascriptExecutor)driver).executeScript('return arguments[0].firstChild.textContent;', new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='element']//following-sibling::p[2]")))).toString());
TEXT3 :
System.out.println(((JavascriptExecutor)driver).executeScript('return arguments[0].childNodes[3].textContent;', new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='element']//following-sibling::p[2]")))).toString());
TEXT4 :
System.out.println(((JavascriptExecutor)driver).executeScript('return arguments[0].lastChild.textContent;', new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='element']//following-sibling::p[2]")))).toString());