Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法在“显式等待”条件内包装“驱动程序。执行_脚本()”_Python_Python 3.x_Selenium_Selenium Webdriver_Web Scraping - Fatal编程技术网

Python 无法在“显式等待”条件内包装“驱动程序。执行_脚本()”

Python 无法在“显式等待”条件内包装“驱动程序。执行_脚本()”,python,python-3.x,selenium,selenium-webdriver,web-scraping,Python,Python 3.x,Selenium,Selenium Webdriver,Web Scraping,我与selenium一起创建了一个python脚本,用于解析网页中的特定内容。我可以通过许多不同的方式获得位于QUOTE下的AARONS INC结果,但我希望通过使用伪选择器来获取该结果,遗憾的是selenium不支持该方法。下面脚本中注释掉的行表示selenium不支持伪选择器 然而,当我在驱动程序中使用伪选择器时,执行

我与selenium一起创建了一个python脚本,用于解析网页中的特定内容。我可以通过许多不同的方式获得位于
QUOTE
下的
AARONS INC
结果,但我希望通过使用
伪选择器来获取该结果,遗憾的是selenium不支持该方法。下面脚本中注释掉的行表示selenium不支持
伪选择器

然而,当我在
驱动程序中使用
伪选择器
时,执行
我就可以完美地解析它。为了实现这一点,我必须使用硬编码延迟,以使该元素能够飞行。现在,我希望对这个
驱动程序进行同样的包装。在
显式等待
条件内执行_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)

如何包装
驱动程序。在显式等待条件下执行\u 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)

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

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)

这是一个简单的方法

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)

这是一个简单的方法

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)

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

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

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

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

这里的伪选择器是什么?为什么不能将xpath与包含文本一起使用?这是
:contains()
@supputuri。我没有说我不能使用xpath来实现这一点。但是,我的问题是关于在显式等待中包装
驱动程序。执行\u script()
。我看到了处理此问题的其他选项,但是我提供了满足您要求的答案。如果您有问题,请检查并告诉我。这里的伪选择器是什么?为什么不能将xpath与包含文本一起使用?这是
:contains()
@supputuri。我没有说我不能使用xpath来实现这一点。但是,我的问题是关于在显式等待中包装
驱动程序。执行\u script()
。我看到了处理此问题的其他选项,但是我提供了满足您要求的答案。如果您有问题,请检查并告诉我。这非常令人印象深刻@pguardiario。这种方法唯一和主要的问题是,如果选择器出现故障或元素不存在,脚本将永远运行。因此,超时选项是必要的,以使其完美无瑕@pguardiario。是的,如果元素不总是存在,只需增加一个计数器并返回false或其他什么。这是非常令人印象深刻的@pguardiario。这种方法的唯一和主要问题是,如果选择器出现故障或元素不存在,脚本将永远运行。因此,timeout选项对于使其完美无瑕是必要的@pguardiario.Yes,如果元素不总是存在,只需增加一个计数器并返回false或其他。不适用于:
wait.until(lambda driver:driver.execute_script(“arguments[0].scrollTop=arguments[0].scrollHeight”,dep))
Any suggestion?不适用于:
wait.until(lambda驱动程序:driver.execute_脚本(“参数[0]。scrollTop=arguments[0]。scrollHeight”,dep))
Any suggestion?