在将硒与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
我在做什么错?有没有办法跳过此错误?感谢您浪费时间在帮助我上:)
答案 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()
希望这对您有所帮助。