我遇到了硒问题。我会尽力解释我的设置以及我正在尝试做的事情。
简短版本:
使用 ruby webdriver gem 在本地运行我的自动化测试工作正常。通过 selenium-server 独立 jar 运行完全相同的脚本(无论是远程还是本地)如果没有对代码进行奇怪的更改,将无法正常工作。
- 有没有办法获得与 webdriver 客户端库行为相同的 selenium 服务器独立 jar 版本?
- 或者是否有一些远程 ruby gem 版本的 selenium 服务器,以便 selenium 的 gemified 版本可以远程工作?
基本总结:“我觉得我在 Hooters 并要求我吃饭。我在这里错过了一些非常基本的东西。”
我正在尝试做的事情:
我正在尝试自动化测试 Web 应用程序。这个想法是能够加载公司的网站,然后像真实用户一样与页面元素进行交互(单击链接、将文本放入文本框、选择单选按钮和复选框等)。我在 mac (10.8.2) 上使用 ruby 1.9.3 和 selenium-webdriver gem 为 ruby 开发了这些测试。我自己创建了一个 ruby 包装库,我称之为“WebAutomation.rb”,我在其中创建了自己的方法来单击元素。我制作的其中一种包装方法的示例如下:
def WebAutomation.click_element_by_attribute(attribute_name, attribute_value, tag, contains=true)
element = WebAutomation.find_element_by_attribute(attribute_name, attribute_value, tag, contains)
@log.debug("Element returned: #{element}")
raise "Could not click element with #{attribute_name} attribute of #{attribute_value}" unless element.click
end
WebAutomation.find_element_by_attribute 调用另一个方法来查看我给它的所有元素。作为另一个抽象层,我不是直接运行 ruby 代码,而是通过黄瓜脚本运行它。这不是我的问题。这段代码都在本地工作——我的意思是当自动驱动的浏览器是正在运行的代码的本地时。
但是,我希望一切都像花哨一样,并且不必在本地运行代码,因为我在 Mac 上,假设我想做跨浏览器测试,就像在 IE 上运行它一样。所以我有一台远程mac和一台远程windows笔记本电脑,目的是通过像Jenkins这样的系统来运行它,Jenkins盒子可以告诉这些远程机器运行浏览器测试。我还没有那么担心詹金斯。我只是想让测试的远程版本通过。
我的烦恼:
在本地运行我的 cucumber/ruby 脚本效果很好。他们太棒了,我以为我就是那个人。然后我使用相同的浏览器(chrome)将它运行到远程mac,一切都结束了。
这就是我正在做的事情:
在远程 Mac 笔记本电脑上,我下载了 selenium-server 独立 jar 并像这样启动它:
java -jar selenium-server-standalone-2.31.0.jar
我看起来很高兴:
Mar 14, 2013 8:00:06 AM org.openqa.grid.selenium.GridLauncher main
INFO: Launching a standalone server
08:00:11.606 INFO - Java: Oracle Corporation 23.6-b04
08:00:11.608 INFO - OS: Mac OS X 10.8.2 x86_64
08:00:11.616 INFO - v2.31.0, with Core v2.31.0. Built from revision 1bd294d
08:00:11.728 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub
08:00:11.729 INFO - Version Jetty/5.1.x
08:00:11.730 INFO - Started HttpContext[/selenium-server/driver,/selenium-server/driver]
08:00:11.730 INFO - Started HttpContext[/selenium-server,/selenium-server]
08:00:11.731 INFO - Started HttpContext[/,/]
08:00:11.744 INFO - Started org.openqa.jetty.jetty.servlet.ServletHandler@4f8429d6
08:00:11.744 INFO - Started HttpContext[/wd,/wd]
08:00:11.747 INFO - Started SocketListener on 0.0.0.0:4444
08:00:11.747 INFO - Started org.openqa.jetty.jetty.Server@4dfbca86
然后我运行我的黄瓜脚本,向它传递一些命令行参数,告诉它转到远程 Mac 笔记本电脑的 IP 以及运行什么浏览器以及我希望浏览器为我们的应用程序转到什么环境(这不是重要的)。
它看起来像这样:
cucumber REMOTE_URL=http://10.110.10.233:4444/wd/hub BROWSER=chrome JJ_ENV=staging features/jabberjaw/contact_us.feature:3
我有代码,当传递 REMOTE_URL 参数时,调用远程浏览器而不是本地浏览器。被执行的代码如下:
#This is the code that runs for a local browser
def WebAutomation.set_browser(browser)
@log.debug("Starting browser: #{browser}")
@driver = Selenium::WebDriver.for(browser)
end
#If the remote url is passed in, then I make a remote browser
def WebAutomation.set_remote_browser(url, browser)
@log.debug("Starting remote browser: #{browser} at #{url}")
@driver = Selenium::WebDriver.for(:remote, :url => url, :desired_capabilities => browser)
end
浏览器窗口会在远程机器上弹出,它会转到正确的 url 并登录。但是,当远程运行时,selenium-server 似乎在单击屏幕上不可见的元素时出现问题。我用
@driver.action.move_to(element, 100, 100).perform
我必须添加 100、100 偏移,因为即使移动似乎也只能到达左上角,并且元素仍然不在屏幕上。另一件事是您知道我引发的异常,除非 element.click(上面的代码)?是的,无论点击是否真的发生,都会触发,因为由于某种原因,远程版本(selenium-server)在 element.click 上返回 nil 是否成功。当我在本地运行相同的代码(它使用 webdriver gem)时,它会在成功时给我一个 {},在不成功时给我一个 nil。因此,要让这段代码在 chrome 上远程工作,我必须执行以下操作:
def WebAutomation.click_element_by_attribute(attribute_name, attribute_value, tag, contains=true)
element = WebAutomation.find_element_by_attribute(attribute_name, attribute_value, tag, contains)
@driver.action.move_to(element, 100, 100).perform
@log.debug("Element returned: #{element}")
element.click
end
本质上,明确地移动到找到的元素,并且只相信点击是有效的。是的,对于黄瓜,我确实有一层薄薄的保护,因为脚本中的下一步应该是 Then 步骤,检查单击应该执行的任何操作是否成功,但是我必须取出那个异常感觉不对并可能让自己接受误报。
甚至这个更改的代码在远程版本的 firefox 上也完全失败(我不得不向下移动到 firefox 18,因为 18 以上的任何东西似乎都不适用于 selenium webdriver - 即使在本地 - 它只是打开浏览器窗口而没有做任何其他事情)。在 Firefox 上,浏览器窗口出现,导航到 url,登录(到目前为止,它就像 chrome),但它只是给了我手指并说“MoveElementTargetOutOfBoundsException”。
我还尝试取出“远程”并尝试在本地运行 selenium-server jar 并在本地浏览器上运行我的测试,但通过 selenium-server jar。像这样!
cucumber REMOTE_URL=http://localhost:4444/wd/hub BROWSER=chrome JJ_ENV=staging features/jabberjaw/contact_us.feature:3
而且我得到了相同的结果,所以我非常确信我的问题是 selenium-server jar 对我的脚本的解释与我的 selenium webdriver gem 完全不同。我不可能是第一个遇到这个问题的人,但我已经用谷歌搜索,直到我的眼睛流血并且找不到解决方案。
必须以某种方式远程解释本地运行的客户端代码,是吗?这不可能是一个新问题,因为如果我必须创建奇怪的自定义代码来确定我是在本地运行还是远程运行以及它是否是 chrome 以及是否是 firefox,那么整个“自动化是强大而令人敬畏的,因为你可以做交叉- 跨环境的浏览器测试和扩展”是一些蛋黄酱包装的芝士蛋糕。那个奶油馅?不要。