12

我正在运行在 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

它无法找到 element id_name,但是当与 FireFox 一起运行时,效果很好。

任何人都知道 PhantomJS 是否存在解决此问题的当前错误?

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

4

6 回答 6

2

另一种可能性是有问题的领域确实是不可交互的。PhantomJS 并不是告诉你它找不到元素,而是告诉你它不能与之交互。我遇到了这样的问题(除了 ChromeDriver),我所要做的就是让浏览器窗口变宽。

正如普罗曼斯基建议的那样,截图。如果您的布局是响应式的,则 PhantomJS 窗口可能比 Firefox 窗口窄,并导致您的元素被隐藏。或者为 PhantomJS 设置更宽的浏览器大小。

值得一试。

于 2013-10-18T02:38:42.497 回答
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 驱动程序实现中截屏!它会给你一个调试问题的可能性

于 2013-10-17T15:03:10.667 回答
1

我遇到了同样的麻烦。我在 Python 中使用 selenium 和 PhantomJS。我正在尝试登录网页,当我使用 firefox 时,它总是可以工作,但即使我的代码“睡眠”了 60 秒,PhantomJS 也不能。代码如下:

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 的请求,接受来自普通客户端的请求。一些服务器不否认。

于 2015-12-26T07:18:47.037 回答
1

我遇到了与 PhantomJS 相同的问题。我通过在创建驱动程序引用后添加一行来设置窗口大小来解决它 -

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

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

于 2017-01-25T10:33:19.853 回答
0

获得此权利的一种方法是检查它是否显示。field=driver.find_element_by_id("id_name") if field.is_displayed(): field.clear()

于 2016-11-17T11:04:40.473 回答
0

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

于 2017-06-26T12:08:20.553 回答