我在使用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
我究竟做错了什么?有没有办法跳过这个错误?感谢你浪费时间帮助我:)
此错误消息...
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()
click()
内。两种可能的解决方案如下:
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()
代替
browser.execute_script(navMenu.click())
尝试
browser.execute_script('arguments[0].click();', navMenu)
要么
navMenu.click()
执行脚本的正确方法是实际编写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()
希望这对你有所帮助。