使用PhantomJS运行Selenium Webdriver时出现InvalidElementStateException

时间:2013-10-07 10:37:47

标签: python selenium selenium-webdriver phantomjs

我正在运行在Firefox中运行良好的selenium测试,但在使用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目前是否存在解决此问题的错误?

目前在Ubuntu 12.04上使用Selenium 2.35.0和PhantomJS 1.9.2

6 个答案:

答案 0 :(得分:2)

我使用了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驱动程序中实现!它将为您提供调试问题的可能性

答案 1 :(得分:2)

另一种可能性是所讨论的领域真的无法互动。 PhantomJS并没有告诉你它找不到元素,但它不能与它交互。我有一个这样的问题(除了它是ChromeDriver),而我所要做的就是让浏览器窗口更宽。

正如promanski建议的那样,截取屏幕截图。如果你的布局是响应式的,那么PhantomJS窗口可能比Firefox的窗口窄,并导致你的元素被隐藏。或者为PhantomJS设置更宽的浏览器尺寸。

值得一试。

答案 2 :(得分:1)

我遇到了同样的麻烦。我在Python中使用selenium和PhantomJS。我正在尝试登录网页,当我使用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”:“元素当前不可交互,可能无法操纵”

但是当我更改网址时,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

我猜原因是某些Web服务器拒绝了PhantomJS的请求,接受来自普通clinet的请求。有些服务器没有否认。

答案 3 :(得分:1)

我和PhantomJS有同样的问题。在创建驱动程序引用后,我通过添加一行来设置窗口大小来解决它 -

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

解决方案是我们需要在执行browser.get(“”)之前设置虚假的浏览器大小。

答案 4 :(得分:0)

实现此目的的一种方法是检查它是否显示。 <!DOCTYPE html> <html lang="en"> <head> <title>Request bugs</title> <script src="jquery-3.1.1.min.js"></script> </head> <body style="background-color: black"> <div id="logs" style="width: 100%;height: 100%; background-color: black;position: absolute;color:white;padding:50px;"></div> <script> $.ajax({ url:'http://localhost', // This url works just fine -> url:'http://httpbin.org/', type:'GET', async: 'true', dataType:'text html', error:function(e){ $("#logs").html("Failure</br> " + eval(e)+$("#logs").html()); }, success:function(){ $("#logs").html("Success</br>"+$("#logs").html()); // $("#logs").html(data); } }); </script> </body> </html>

答案 5 :(得分:0)

我已经通过用户代理更改解决了这个问题,我将其设置为幻像js功能。试试这个one