【发布时间】:2020-09-11 18:05:33
【问题描述】:
如何通过在 selenium java 中获取整个 div 的数据来比较从后端获取到我的 java 代码中的数据列表与 ui 元素?请建议是否有一种方法可以从 ui div 中获取所有元素的 text() 并放入 driver.findelements 以外的列表中
【问题讨论】:
如何通过在 selenium java 中获取整个 div 的数据来比较从后端获取到我的 java 代码中的数据列表与 ui 元素?请建议是否有一种方法可以从 ui div 中获取所有元素的 text() 并放入 driver.findelements 以外的列表中
【问题讨论】:
您可以通过 for 循环进行迭代并检查您的文本
following code for java , what I am doing here is open google browser and typing as "TESTING" AND store all results and checking word as "Testing Types" and click that option
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.List;
public class GooglesearchTests {
public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "C:\\Users\\User\\Downloads\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://www.google.com/");
driver.findElement(By.name("q")).sendKeys("Testing");
Thread.sleep(Long.parseLong("1000"));
List<WebElement> LIST = driver.findElements(By.xpath("//ul[@role='listbox']//li/descendant::div[@class='sbl1']"));
System.out.println(LIST.size());
for (int i = 0; i < LIST.size(); i++)
{
//System.out.println(LIST.get(i).getText());
if (LIST.get(i).getText().contains("testing types"))
{
LIST.get(i).click();
break;
}
}
}
}
【讨论】:
如问题中所述,您正在寻找driver.findElements() 的替代方案。你可以使用下面的 JavaScript Executor 来实现。
List<String> lst = new ArrayList<String>();
JavascriptExecutor js = (JavascriptExecutor)driver;
Long length = (Long) js.executeScript("return document.getElementsByClassName('r').length");
for(int i=0; i<length; i++) {
lst.add((String) js.executeScript("return document.getElementsByClassName('r')[arguments[0]].innerText", i).toString().trim());
}
【讨论】:
您可以使用 Java 流 API 轻松完成。假设您有这样的页面(假设您已将代码保存到/tmp/texts.html):
<html>
<head/>
<body>
<div id="root">
<div>text 1</div>
<div>
<div>text 2</div>
<div>text 3</div>
</div>
</div>
</body>
</html>
您现在可以执行以下操作:
public void testList() {
driver.get("file:///tmp/texts.html");
List<WebElement> webElements = driver
.findElements(
By.xpath("//div[@id='root']//div[not(child::*)]"));
List<String> texts = webElements
.stream()
.map(webElement -> webElement.getText())
.collect(Collectors.toList());
System.out.println(texts);
}
此示例演示如何使用单个流表达式从元素中收集文本。
P.S. - xpath 中的 [not(child::*)] 部分意味着我们只获取叶节点。
【讨论】: