无法将“driver.execute_script()”包装在“显式等待”条件下



我创建了一个python脚本和selenium来解析网页中的特定内容。我可以AARONS INC以许多不同的方式获得此结果,但我希望通过QUOTE pseudo selector来抓取它,不幸的是硒不支持。下面脚本中注释掉的行表示硒不支持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()

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

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)

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

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

这是简单的方法。

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)

最新更新