在 driver.execute_script() 中使用伪选择器时无法将某些元素滚动到视图中

MIT*_*THU 3 python selenium web-scraping python-3.x selenium-chromedriver

我已经使用 selenium 创建了一个脚本来获取动态生成的文本。我要求使用 selenium,所以在这种情况下我不想使用 xhr。我正在尝试pseudo selector在其中定义硒中使用explicit wait。由于 selenium 不支持pseudo selector,如:contains(),我使用 javascript 命令driver.execute_script()来达到目的。

现在,我尝试的方式不一致,因为我想要抓取的文本不在视口内。如果我在脚本运行时手动向下滚动一点,它会起作用。顺便说一下,Xpath 不是这里的一个选项。

在 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)
Run Code Online (Sandbox Code Playgroud)

预期结果:

AARONS INC
Run Code Online (Sandbox Code Playgroud)

PS 在将此帖子标记为重复之前,请确保您至少阅读了问题的标题。

Guy*_*Guy 5

您可以使用返回WebElement来执行另一个 JavaScript 命令

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

driver.execute_script('arguments[0].scrollIntoView();', item)
Run Code Online (Sandbox Code Playgroud)

或者在单个脚本中

item = wait.until(
    lambda d: d.execute_script(
        '''var el = $('span:contains("AARONS")')[0];
        if (typeof el !== "undefined") {
            el.scrollIntoView();
        }
        return el;''')
)
Run Code Online (Sandbox Code Playgroud)

这将等到元素存在并将其滚动到视图中。