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. Попробуйте один.