Python + Selenium 有效获取列表中元素的属性

标签 python selenium selenium-webdriver phantomjs

使用 Python、Selenium 和 PhantomJS 获取多个元素的相同属性的最有效方法是什么?我的解决方案使用 find_elements_by_css_selector 找到我需要的所有元素,这需要不到一秒钟的时间,然后我遍历列表以获取我需要的属性。我的循环处理了大约 2500 个元素,这对我来说似乎很多,因为所有元素都是使用 find_elements_by_css_selector 方法映射的。 get_attribute 方法真的那么昂贵还是我做错了什么?

from selenium import webdriver

driver = webdriver.PhantomJS(executable_path=r'mypath\phantomjs.exe')
driver.set_window_size(1120, 550)
driver.get("https://www.something.com")

table = []
elements = driver.find_elements_by_css_selector("tr[id*='bet-']") # takes under 1 second

for element in elements:
   table.append(element.get_attribute('data-info')) # takes over 60 seconds (2000 elements)

driver.close

最佳答案

问题是,每个 .get_attribute() selenium 命令都是一个 JSON HTTP wire request而且,它当然会带来很多开销。

没有直接的方法对多个元素进行“批量获取属性”。

您可能做的最接近的事情是通过 JavaScript 获取属性,发出 execute_script(),这是一个 JSON HTTP 命令:

attributes = driver.execute_script("""
    var result = []; 
    var all = document.querySelectorAll("tr[id*='bet-']"); 
    for (var i=0, max=all.length; i < max; i++) { 
        result.push(all[i].getAttribute('data-info')); 
    } 
    return result;
""")

这种方法的一个缺点是在这种情况下元素属性检索逻辑不是基于 webdriver API specification - 如果您在代码库中同时遵循基于 selenium 和基于 js 的方法,这可能会导致结果不一致。

一些相关主题:

关于Python + Selenium 有效获取列表中元素的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43047606/

相关文章:

python - 使 Vigenére 加密/解密跳过空格

python - 使用 Bokeh 将图例定位在绘图区域之外

python - 根据索引将Python列表拆分为多个列表

eclipse - Robot框架和python selenium组合时的调试测试用例

python - django 测试 response.context TypeError : 'NoneType' object is not subscriptable

c# - 如何区分报告上的测试套件和测试用例

python - 如何使用Python和Selenium库与深度嵌套的 'input' html对象交互

selenium - 在Selenium Grid中使用无限的maxInstance

java - 模态对话框存在异常

java - driver.getcurrenturl() 没有获取正确的url