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

我已经使用硒创建了一个脚本来获取动态生成的文本。我必须使用硒,因此在这种情况下,我不想使用xhr。我正在尝试在硒中使用pseudo selector在其中定义explicit wait。由于硒不像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)

预期结果:

AARONS INC

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

参考方案

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

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

driver.execute_script('arguments[0].scrollIntoView();', item)

或在一个脚本中

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

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

单行的'if'/'for'语句是否使用Python样式好? - python

我经常在这里看到某人的代码,看起来像是“单线”,这是一条单行语句,以传统的“if”语句或“for”循环的标准方式执行。我在Google周围搜索,无法真正找到可以执行的搜索类型?任何人都可以提出建议并最好举一些例子吗?例如,我可以一行执行此操作吗?example = "example" if "exam" in exam…

为什么使用'=='或'is'比较字符串有时会产生不同的结果? - python

我有一个Python程序,其中将两个变量设置为'public'值。在条件表达式中,我有比较var1 is var2失败,但如果将其更改为var1 == var2,它将返回True。现在,如果我打开Python解释器并进行相同的“是”比较,则此操作成功。>>> s1 = 'public' >>…

在返回'Response'(Python)中传递多个参数 - python

我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…

python JSON对象必须是str,bytes或bytearray,而不是'dict - python

在Python 3中,要加载以前保存的json,如下所示:json.dumps(dictionary)输出是这样的{"('Hello',)": 6, "('Hi',)": 5}当我使用json.loads({"('Hello',)": 6,…

sqlite3连接用作上下文管理器的事务不是原子的 - python

According to the documentation, 连接对象可用作自动提交或回滚事务的上下文管理器。发生异常时,事务将回滚;否则,将提交事务:我知道with语句中的所有内容都应该是原子事务。现在考虑这段代码import sqlite3 con = sqlite3.connect(':memory:') try: with co…