无法在“明确等待”条件下包装“ driver.execute_script()”

时间:2019-07-22 18:37:57

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

我已经创建了一个python脚本和selenium来解析网页中的特定内容。我可以通过许多不同的方式获得位于AARONS INC下的QUOTE结果,但我希望通过使用 pseudo selector 不幸的是,硒不支持。下面脚本中带注释的行表示硒不支持pseudo selector

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

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()

3 个答案:

答案 0 :(得分:2)

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

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)

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

这是简单的方法。

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)