如何更快地从Selenium WebElement获取值?

这是我从Selenium WebElement获得价值的测试代码。

import java.util.List;    

import org.apache.commons.lang3.ObjectUtils.Null;

import org.openqa.selenium.By;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebDriverException;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.firefox.FirefoxDriver;

public class Scan extends WebDriverException {

private long start = 0;

private WebDriver driver = null;

public static void main(String[] args) {

Scan scan = new Scan();

scan.driver = new FirefoxDriver();

scan.driver.get("https://en.wikipedia.org/");

scan.scanAllElements();

scan.driver.quit();

}

public void scanAllElements() {

// get all elements

List<WebElement> elms = driver.findElements(By.xpath("//*"));

System.out.println("elms size:" + elms.size());

// start timer

this.start = System.currentTimeMillis();

// scan all elements and get some value.

for (WebElement elm : elms) {

elm.getTagName();

elm.getAttribute("class");

elm.getAttribute("id");

elm.getAttribute("href");

elm.getText();

elm.getSize();

elm.getLocation();

}

// check the time

stopTimer(elms.size());

}

public void stopTimer(int elmsSize) {

long end = System.currentTimeMillis();

long ms = end - this.start;

long sec = ms / 1000;

long min = sec / 60;

System.out.println("--- Speed Test ---");

System.out.println(ms + " ms");

System.out.println(sec + " s");

System.out.println(min + " min " + (sec % 60) + " s ");

System.out.println("1 loop average time:" + (ms / elmsSize) + " ms");

}

}

结果就是这样,这需要很长时间。我想快点。

elms size:1031

--- Speed Test ---

123468 ms

123 s

2 min 3 s

each loop average time:119 ms

我做了什么。

回答:

如果价值不是我想要的。跳过以(继续)获得另一个获取值。

回答:

此示例获取所有元素(// *)。因此,当我得到它时,我过滤了元素,这是个好方法。但是我仍然有几百个要素,我需要最小化处理时间。

回答:

我测试了Runnable Callable Stream。

Runnable和Callable解决了速度问题。处理时间变为40%左右。但是许多元素变成了空!

流仅最小化10%的时间,而且某些元素为null。

如果您有什么想法可以更快地获得它,请告诉我!

回答:

您可以使用Javascript,以下代码将几乎立即返回包含标签名称,id,href,类键的Map的ArrayList:

ArrayList<Maps> list = (ArrayList) ((JavascriptExecutor) driver).executeScript("return [...document.querySelectorAll(\"*\")].map(e=>{return {tagName:(e.tagName==undefined?null:e.tagName),class:(e.className==undefined?null:e.className),id:(e.id==undefined?null:e.id),href:(e.href==undefined?null:e.href)}})");

您只需要添加js代码即可获取位置和大小。对于文本,您可以使用textContent。

在执行脚本之前,请确保已加载页面。

以上是 如何更快地从Selenium WebElement获取值? 的全部内容, 来源链接: utcz.com/qa/404868.html

回到顶部