selenium.common.exceptions.WebDriverException:消息:未知错误:通过Selenium Python使用execute_script()时,'script'必须是字符串

问题描述 投票:1回答:3

我在使用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

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

javascript python selenium selenium-webdriver webdriver
3个回答
3
投票

此错误消息...

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()方法将元素的引用作为参数[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)

你可以在What does argument [0] and argument [1] mean in javascriptexecutor in Selenium WebDriver?找到详细的讨论


你的主要问题的提示是错误element not visible,它暗示了以下任何一种情况:

  • 您甚至在元素可见/可点击之前尝试调用click()
  • Viewport被调用时,元素不在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()方法将元素放在Viewport中,然后调用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()

3
投票

代替

browser.execute_script(navMenu.click())

尝试

browser.execute_script('arguments[0].click();', navMenu)

要么

navMenu.click()

2
投票

执行脚本的正确方法是实际编写JavaScript脚本!

selenium的click()函数位于DOM的元素上,而不是脚本。

正如@Andersson建议尝试browser.execute_script('arguments[0].click();', navMenu)

我可以看到你加入了3秒的睡眠...使用Selenium我们通常使用WebDriverWait你可以了解更多关于wait的here

如果它太复杂,你可以从driver.implicitly_wait(3)开始而不是睡觉。

编辑:

如果Element尚未显示,您可以使用navMenu.is_displayed()

希望这对你有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.