首页 > 解决方案 > selenium.common.exceptions.WebDriverException:消息:未知错误:“脚本”必须是字符串,同时通过 Selenium Python 使用 execute_script()

问题描述

我在使用 selenium 和 python 时遇到了 browser.execute_script 的问题。有一个我想点击的元素(下面是 xpath)

"//*[@id='listFav_FI410_23244709400000_FAGNNURROR_IPOF_APP_P43070_W43070A_CP000A001_40']/table/tbody/tr/td[1]"

我尝试这样做:

navMenu = browser.find_element_by_xpath("//*[@id='listFav_FI410_23244709400000_FAGNNURROR_IPOF_APP_P43070_W43070A_CP000A001_40']/table/tbody/tr/td[1]")
time.sleep(3)
browser.execute_script(navMenu.click())

它可以工作(因此它会单击所需的元素),但在执行此操作后会立即引发终止脚本的错误:

selenium.common.exceptions.WebDriverException: Message: unknown error: 'script' must be a string

我究竟做错了什么?有没有办法跳过这个错误?谢谢你浪费你的时间来帮助我:)

标签: javascriptpythonseleniumselenium-webdriverwebdriver

解决方案


此错误消息...

selenium.common.exceptions.WebDriverException: Message: unknown error: 'script' must be a string

...意味着使用错误类型的参数execute_script()调用该方法。

execute_script()方法定义为:

execute_script(script, *args)
    Synchronously Executes JavaScript in the current window/frame.

Where:
    script: The JavaScript to execute
    *args: Any applicable arguments for your JavaScript.

在您的代码中,试用executeScript()方法将元素的引用作为arguments[0]以及要执行的方法(在这种情况下click()),并且此后应提供引用。所以@Andersson 的解决方案应该有效。

navMenu = browser.find_element_by_xpath("//*[@id='listFav_FI410_23244709400000_FAGNNURROR_IPOF_APP_P43070_W43070A_CP000A001_40']/table/tbody/tr/td[1]")
browser.execute_script("arguments[0].click()", navMenu)

您可以在 Selenium WebDriver 的 javascriptexecutor 中的参数 [0] 和参数 [1] 是什么意思中找到详细讨论?


对您的主要问题的提示是错误element not visible,这意味着以下两种情况之一:

  • click()您甚至在元素可见/可点击之前尝试调用
  • 调用时元素不在视口内。click()

解决方案

两种可能的解决方案如下:

  • 诱导WebDriverWait使元素可点击,如下所示:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    # other lines of code
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//*[@id='listFav_FI410_23244709400000_FAGNNURROR_IPOF_APP_P43070_W43070A_CP000A001_40']/table/tbody/tr/td[1]"))).click()
    
  • 使用executeScript()方法将元素带入视口,然后调用click()如下:

    navMenu = browser.find_element_by_xpath("//*[@id='listFav_FI410_23244709400000_FAGNNURROR_IPOF_APP_P43070_W43070A_CP000A001_40']/table/tbody/tr/td[1]")
    browser.execute_script("arguments[0].scrollIntoView(true);",navMenu);
    navMenu.click()
    

推荐阅读