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

时间:2018-09-05 14:11:56

标签: javascript python selenium selenium-webdriver webdriver

在将硒与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

我在做什么错?有没有办法跳过此错误?感谢您浪费时间在帮助我上:)

3 个答案:

答案 0 :(得分:3)

代替

browser.execute_script(navMenu.click())

尝试

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

navMenu.click()

答案 1 :(得分: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()方法中,元素的引用为 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)

您可以在What does argument [0] and argument [1] mean in javascriptexecutor in Selenium WebDriver?

中找到详细的讨论

主要问题的提示是错误element not visible,它暗示以下两种情况之一:

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

解决方案

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

  • 促使 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()
    

答案 2 :(得分:2)

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

硒的click()功能位于您未找到的DOM元素上,而不是脚本。

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

我可以看到您增加了3秒钟的睡眠时间...使用硒,我们通常使用WebDriverWait,您可以了解有关等待的here的更多信息。

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

编辑:

如果尚未显示该元素,则可以使用navMenu.is_displayed()

希望这对您有所帮助。