InvalidElementStateException при запуске Selenium Webdriver с PhantomJS

Я запускаю тесты selenium, которые работают нормально в Firefox, но я получаю сообщение об ошибке при использовании PhantomJS.

Вот мой код на Python:

    driver.find_element_by_link_text("Add Province").click()
    driver.find_element_by_id("id_name").clear()
    driver.find_element_by_id("id_name").send_keys("Frosinone")
    driver.find_element_by_id("id_code").clear()
    driver.find_element_by_id("id_code").send_keys("FR")

И вот ошибка, которую я получаю:

driver.find_element_by_id("id_name").clear()
self._execute(Command.CLEAR_ELEMENT)
return self._parent.execute(command, params)
self.error_handler.check_response(response)
raise exception_class(message, screen, stacktrace)
E       InvalidElementStateException: Message: u'Error Message => \'Element is not currently interactable and may not be manipulated\'\n caused by Request => {"headers":{"Accept":"application/json","Accept-Encoding":"identity","Connection":"close","Content-Length":"81","Content-Type":"application/json;charset=UTF-8","Host":"127.0.0.1:38159","User-Agent":"Python-urllib/2.7"},"httpVersion":"1.1","method":"POST","post":"{\\"sessionId\\": \\"e0d4d1b0-2f36-11e3-af69-b579903d9fbd\\", \\"id\\": \\":wdc:1381139859399\\"}","url":"/clear","urlParsed":{"anchor":"","query":"","file":"clear","directory":"/","path":"/clear","relative":"/clear","port":"","host":"","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/clear","queryKey":{},"chunks":["clear"]},"urlOriginal":"/session/e0d4d1b0-2f36-11e3-af69-b579903d9fbd/element/%3Awdc%3A1381139859399/clear"}' ; Screenshot: available via screen

Не удается найти элемент id_name, но при работе с FireFox работает отлично.

Кто-нибудь знает, существует ли ошибка с PhantomJS, которая устраняет эту проблему?

В настоящее время используется Selenium 2.35.0 и PhantomJS 1.9.2 на Ubuntu 12.04

Ответ 1

Я использовал PhantomJS, ChromeDriver и FirefoxDriver для функционального тестирования. Разница между PhantomJS и другими заключается в том, что драйвер PhantomJS не дождался загрузки страницы и возвращает управление тестовой программе (ваш код на Python). Пожалуйста, проверьте это!

Я думаю, что это неправильное поведение драйвера PhantomJS. Я нашел в документации WebDriver api: http://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/WebDriver.html#get(java.lang.String) следующий метод WebDriver, который открывает данный URL

void get(java.lang.String url)

Описание:

Загрузите новую веб-страницу в текущее окно браузера. Это делается (...), и метод будет блокироваться до завершения загрузки.

Так что возможно, что (и здесь я согласен с комментарием @Ashley)

  • в Firefox страница полностью отображается до того, как тестовый код попытается получить доступ к элементу
  • в PhantomJS тестовый код пытается взаимодействовать со страницей раньше, когда еще не готов

Вы можете легко найти, если вы "спёте" свой тестовый код, скажем, через 2 секунды, перед тем как получить доступ к первому элементу в вашем тесте.

Если это так, вы можете попытаться решить эту проблему, ожидая загрузки страницы (вместо 2 секунд), проверив некоторые условия на вашей странице, например. заголовок страницы должен быть "Моя форма". Попробуйте в цикле, пока условие не будет истинным. Затем запустите остаток теста.

Примечание. Вы всегда можете делать скриншоты, а также в безголовую реализацию драйвера PhantomJS! Это даст вам возможность отладить проблему.

Ответ 2

Другая возможность заключается в том, что поле, о котором идет речь, действительно не взаимодействует. PhantomJS не говорит вам, что не может найти элемент, но он не может взаимодействовать с ним. У меня была такая проблема (за исключением ChromeRriver), и все, что мне нужно было сделать, это увеличить окно браузера.

Как промански предложили, сделайте снимок экрана. Если ваш макет является отзывчивым, возможно, окно PhantomJS уже, чем Firefox, и заставляет ваш элемент быть скрытым. Или установите размер браузера шире для PhantomJS.

Стоит сделать снимок.

Ответ 3

У меня такая же проблема. Я использую селен и PhantomJS в Python. Я пытаюсь войти на веб-страницу, когда я использую firefox. Он всегда работает, но PhantomJS даже не имеет, если я "сплю" свой код на 60. Код ниже:

from selenium import webdriver

driver = webdriver.PhantomJS(executable_path='phantomjs.exe')
# driver = webdriver.Firefox()
driver.get("http://gs.swjtu.edu.cn/ws/gsedu")
time.sleep(60)
form_id = driver.find_element_by_name('userid')
form_id.send_keys('2015xxxxxx')
form_pswd = driver.find_element_by_name("userpwd")
form_pswd.send_keys('xxxxxx99201xxxxxx')
driver.find_element_by_class_name("loginbtn").submit()
print(driver.current_url)

Я получил сообщение об ошибке:

selenium.common.exceptions.InvalidElementStateException: Сообщение: { "errorMessage": "Элемент в настоящее время не взаимодействует и не может быть обработан"

Но когда я меняю URL-адрес, PhantomJS работает. Вот как это:

driver = webdriver.PhantomJS(executable_path='phantomjs.exe')
driver.get("http://www.baidu.com")
driver.find_element_by_id('kw').send_keys('python')
driver.find_element_by_id('su').submit()
print(driver.current_url)

тогда печать:

https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=python&rsv_pq=ceb307010003f0d6&rsv_t=3b72xijigkGFAWp%2FpwxdE0rDAVeegFlzHpa5aXwPD2mBVBRvSQbTKn7Ra%2FQ&rsv_enter=1&rsv_sug3=6&rsv_sug1=1&rsv_sug7=100&inputT=504&rsv_sug4=505

Я предполагаю, что причина в том, что какой-то веб-сервер отклоняет форму запроса PhantomJS, принимает запрос от обычной клиники. некоторый сервер не отрицает.

Ответ 4

Один из способов получить это право - проверить, отображается ли оно. field=driver.find_element_by_id("id_name") if field.is_displayed(): field.clear()

Ответ 5

Я получал ту же проблему с PhantomJS. Я решил это, добавив строку для установки размера окна после создания ссылки на драйвер как -

driver = webdriver.PhantomJS()
driver.set_window_size(1124, 850) # set browser size.
driver.get("http:example.com") # Load page

Решение - нам нужно установить поддельный размер браузера, прежде чем делать browser.get("").

Ответ 6

Я исправил эту проблему с изменением пользовательского агента, настроенным на phantom js. Попробуйте один.