使用Java中的Selenium快速获取每个WebElement的class属性

我希望用selenium快速获取页面上每个WebElement的class属性。 目前,我正在做以下事情:

 allElements = new ArrayList(m_webDriver.findElements(By.cssSelector("*"))); for (WebElement element : allElements) { String className = element.getAttribute("class"); } 

这个过程非常慢,在包含500个元素的页面上花费超过30秒。 我尝试并行化getAttribute调用,这是该方法中最慢的部分,但没有速度增加。 这让我相信每次调用getAttribute都是获取信息而不是在本地存储信息。

有没有更快或可并行的方式来做到这一点?

问题是, 你不能让selenium发送批处理getAttribute()调用多个元素。 这是我所研究的类似问题 – 它是关于使isDisplayed()适用于多个元素,而不对列表中的每个元素进行JSON Wire协议请求:

  • Selenium如何批量许多isElementDisplayed调用?

但是,与这个isDisplayed()问题相反,这里我们可以执行javascript并可靠地获取页面上每个元素的类属性值,这样就可以让你开始:

 JavascriptExecutor js = (JavascriptExecutor) driver; js.executeScript("var result = []; " + "var all = document.getElementsByTagName('*'); " + "for (var i=0, max=all.length; i < max; i++) { " + " result.push({'tag': all[i].tagName, 'class': all[i].getAttribute('class')}); " + "} " + " return result; "); 

我会保持简单并使用XPath而不是复杂的Javascript片段:

 // get all elements where class attribute is not null List allElements = m_webDriver.findElements( By.xpath(".//*[@class and not(ancestor::div[contains(@style,'display:none')])]") ); for (WebElement element : allElements) { String className = element.getAttribute("class"); }