Это сообщение об ошибке ...
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)
Подробное обсуждение можно найти в Что означают аргумент [0] и аргумент [1] в javascriptexecutor в Selenium WebDriver?
Подсказка к вашей основной проблеме - ошибка 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()
, чтобы поместить элемент в 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()