selenium.common.exceptions.WebDriverException: Сообщение: неизвестная ошибка: «script» должен быть строкой при использовании execute_script () через Selenium Python - PullRequest
0 голосов
/ 05 сентября 2018

У меня проблема с browser.execute_script при использовании селена с python. Есть элемент, на который я хотел бы нажать (ниже указан 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 голосов
/ 05 сентября 2018

Правильный способ выполнения скрипта - это на самом деле написать скрипт JavaScript! .

Функция click() для селена находится на элементе DOM, который вы обнаружили, а не на сценарии.

Как @Andersson предложил попробовать browser.execute_script('arguments[0].click();', navMenu)

Я вижу, что вы добавили сон на 3 секунды ... Используя Selenium, мы обычно используем WebDriverWait, вы можете узнать больше о ожидания здесь .

Если это слишком сложно, вы можете просто начать с driver.implicitly_wait(3) вместо сна.

Edit:

Если элемент еще не отображается, вы можете просто использовать navMenu.is_displayed()

Надеюсь, это поможет вам.

0 голосов
/ 05 сентября 2018

Это сообщение об ошибке ...

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()
    
0 голосов
/ 05 сентября 2018

вместо

browser.execute_script(navMenu.click())

попробовать

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

или

navMenu.click()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...