这是我从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。 在执行脚本之前,请确保已加载页面。