为什么在Python中运行Javascript+;Seleniuim是否收到未定义的错误?

为什么在Python中运行Javascript+;Seleniuim是否收到未定义的错误?,javascript,python,selenium,Javascript,Python,Selenium,我正在尝试使用Javascript在页面上获取一个表体元素,如果我尽快运行它,就会得到未定义的结果,但是如果我等待几秒钟,它就会工作 def get_row_list(browser): table_body = browser.execute_script(""" var tbody = document.getElementsByClassName("sortable")[0].children[1] return tbody """)

我正在尝试使用Javascript在页面上获取一个表体元素,如果我尽快运行它,就会得到未定义的结果,但是如果我等待几秒钟,它就会工作

def get_row_list(browser):
    table_body = browser.execute_script("""
        var tbody = document.getElementsByClassName("sortable")[0].children[1]
        return tbody
    """)
    while table_body == None:
        browser.execute_script("""
            var tbody = document.getElementsByClassName("sortable")[0].children[1]
            return tbody
        """)
    return table_body.find_elements_by_tag_name("tr")
如果我运行得太早,我会
消息:TypeError:document.GetElementsByCassName(…)[0]未定义

要了解此操作不起作用的原因,这里的关键组件是您在为时过早时收到的错误

基本上,文档尚未加载。这意味着您的DOM(文档对象模型)表示尚未准备好进行解析


基本上,您的代码是在等待加载文档之前,浏览器正在执行脚本。要绕过此问题,请在DOM准备就绪时发出一个信号。

元素
可排序
尚未呈现

用于等待元素加载的UE:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

WebDriverWait(driver, 10).until(
        EC.presence_of_all_elements_located((By.CLASS_NAME, "sortable"))

希望这对你有帮助

我不知道这在Python中使用JS时是否有效,但这在仅执行JS时确实有用

尝试:


这应该等到加载DOM后再查找所需的元素

在呈现您要查找的元素之前,脚本可能正在运行。检查GM开始时间选项或延迟执行。我认为Javascript直接与DOM交互,并且总是准备好的?没有任何东西总是准备好的,DOM是由浏览器构建的。作为一个刷新者,您的DOM是在页面加载时创建的,它不能总是准备好,因为这意味着页面已经存在于内存中。我想使用Javascript来查找此元素,因为使用类似于您最初使用的方法会使我丢失元素sometimes@MosheSlavin更可取的是,,如果你想像专业人士那样做。如果你想使用执行脚本,那么为什么要使用selenium,进行扩展或类似的操作。如果OP只想使用
execute\u script
,这就是方法+1然而,硒的最佳实践是使用等待方法……我会接受这一点,它说我必须等待一分钟,这正是我想要的:)
table_body = browser.execute_script("""
    document.onload = function() {
      document.getElementsByClassName("sortable")[0].children[1];
      return tbody;
    }
""")