0

我遇到了硒问题。我会尽力解释我的设置以及我正在尝试做的事情。

简短版本:

使用 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,那么整个“自动化是强大而令人敬畏的,因为你可以做交叉- 跨环境的浏览器测试和扩展”是一些蛋黄酱包装的芝士蛋糕。那个奶油馅?不要。

4

2 回答 2

0

所以看起来我能够找到部分解决方案。

显然,仅仅启动 selenium 服务器独立 jar 是不够的。以下让我更进一步。

在服务器系统上(将打开并与实际浏览器交互的远程系统):

java -jar selenium-server-standalone-2.31.0.jar -role hub

然后在一个新的终端窗口中(仍然是服务器系统):

java -jar selenium-server-standalone-2.31.0.jar -role node http://localhost:4444/grid/register

然后在客户端系统上(带有实际黄瓜和 webdriver 脚本的系统)

cucumber REMOTE_URL=http://10.110.10.233:4444/wd/hub BROWSER=firefox JJ_ENV=staging

**注意,如果您在家里跟随,此命令将有所不同,因为我编写了脚本以接受 REMOTE_URL 和 BROWSER 变量以映射到远程 webdriver 调用。

无论如何,这允许没有显式移动方法的原始代码工作。我仍然必须消除我的加注条件,因为远程访问时,无论成功与否,点击仍然给我零。Firefox 也不再抛出 MoveElementTargetOutOfBoundsException。

测试似乎仍然比在本地运行时脆弱得多,但至少是一些进步。如果有人知道为什么我的点击在远程运行时总是给我“零”,无论成功与否,我都会很感激。如果有人还知道为什么添加这些角色参数(可能还有注册)与java -jar seleneium-server-standalone-2.31.0.jar我阅读的几乎所有教程都告诉我要做的常规命令相比,为什么添加这些角色参数(可能还有注册)似乎可以稳定事情,我会对此感兴趣。

然而,就像一大碗纤维一样,这些命令至少让我畅通无阻。没有什么比大堵塞更糟糕的了。我希望如果其他人也有类似的麻烦,这也能帮助你。

于 2013-03-15T20:18:41.840 回答
0

我也让自己在 Windows 远程测试上畅通无阻。显然,为此,我需要获取 chromedriver.exe 和 ieserverdriver.exe 并将它们放在服务器系统上。在windows上,你仍然需要启动hub,但是在启动节点时,你需要添加以下参数:

-Dwebdriver.chrome.driver=<path_to_chromedriver.exe> -Dwebdriver.ie.driver=<path_to_ieserverdriver.exe>

然后在我的客户端机器上,我不得不使用端口 5555 而不是 4444。

于 2013-03-18T17:06:04.170 回答