【问题标题】:Unable to wrap `driver.execute_script()` within `explicit wait` condition无法在“显式等待”条件下包装“driver.execute_script()”
【发布时间】:2019-07-22 18:37:57
【问题描述】:

我与 selenium 一起创建了一个 python 脚本来解析网页中的特定内容。我可以通过多种不同的方式获得位于QUOTE 下的AARONS INC 的结果,但我希望通过使用 pseudo selector 来抓取它,不幸的是 selenium 没有'支持。下面脚本中注释掉的行表示 selenium 不支持pseudo selector

但是,当我在 driver.execute_script() 中使用 pseudo selector 时,我可以完美地解析它。为了完成这项工作,我必须使用硬编码延迟来使元素可用。现在,我希望在Explicit Wait 条件中包装这个driver.execute_script()

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 20)

driver.get("https://www.nyse.com/quote/XNYS:AAN")
time.sleep(15)
# item = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "span:contains('AARONS')")))
item = driver.execute_script('''return $('span:contains("AARONS")')[0];''')
print(item.text)

如何将driver.execute_script() 包装在显式等待条件中?

【问题讨论】:

  • 这里的伪选择器是什么?为什么不能使用包含文本的 xpath?
  • 这是:contains()@supputuri。我没有说我不能使用 xpath 来实现这一点。但是,我的问题是关于在显式等待中包装 driver.execute_script()
  • 我看到了其他选项来处理这个问题,但是我提供了满足您要求的答案。如果您有任何问题,请查看并告诉我。

标签: python python-3.x selenium selenium-webdriver web-scraping


【解决方案1】:

这是实现这一目标的方法之一。试一试。

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

with webdriver.Chrome() as driver:
    wait = WebDriverWait(driver, 10)
    driver.get('https://www.nyse.com/quote/XNYS:AAN')

    item = wait.until(
        lambda driver: driver.execute_script('''return $('span:contains("AARONS")')[0];''')
    )
    print(item.text)

【讨论】:

  • 不适用于:wait.until( lambda driver: driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", dep)) 有什么建议吗?
【解决方案2】:

您可以在浏览器脚本中执行 while 操作,这可能更安全:

item = driver.execute_async_script("""
  var span, interval = setInterval(() => {
    if(span = $('span:contains("AARONS")')[0]){
      clearInterval(interval)
      arguments[0](span)
    }
  }, 1000)
""")

【讨论】:

  • 这令人印象深刻@pguardiario。
  • 这种方法的唯一和主要问题是,如果选择器出现故障或元素不存在,脚本将永远运行。因此,需要超时选项才能使其完美无瑕@pguardiario。
  • 是的,如果元素不总是在那里,只需增加一个计数器并返回 false 或其他东西。
【解决方案3】:

这是简单的方法。

url = 'https://www.nyse.com/quote/XNYS:AAN'
driver.get(url)
# wait for the elment to be presented
ele = WebDriverWait(driver, 30).until(lambda driver: driver.execute_script('''return $('span:contains("AARONS")')[0];'''))
# print the text of the element
print (ele.text)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多