Selenium Server的行为与WebDriver不同

时间:2013-03-14 15:33:04

标签: ruby cucumber selenium-webdriver

我有硒问题。我会尽力解释我的设置以及我想要做的事情。

简短版本:

使用ruby webdriver gem在本地运行我的自动化测试工作正常。通过selenium-server独立jar(无论是远程还是本地)运行完全相同的脚本,如果没有代码中的奇怪更改,就无法运行。

  • 有没有办法让selenium服务器独立jar的版本与webdriver客户端库的行为相同?
  • 或者是否有一些selenium服务器的远程ruby gem版本,但是硒的宝石版本可以远程工作?

基本摘要:"我觉得自己喜欢Hooters并要求我去吃饭。我在这里缺少一些非常基本的东西。"

我想做的事情:

我正在尝试自动测试Web应用程序。我们的想法是能够加载公司的网站,然后像真实用户那样与页面元素进行交互(点击链接,将文本放入文本框,选择单选按钮和复选框等)。我使用ruby 1.9.3开发了这些测试,并在mac(10.8.2)上开发了用于ruby的selenium-webdriver gem。我自己创建了一个ruby包装器库,我称之为#34; 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盒子可以告诉这些远程机器运行浏览器测试。我还没有那么远,我担心詹金斯。我只是想让远程版本的测试通过。

我的烦恼:

在本地运行我的黄瓜/红宝石脚本非常棒。他们很棒,我以为我就是男人。然后我使用相同的浏览器(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)时,它会在成功时给我{},而在没有成功时给我。因此,要使此代码在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上,浏览器窗口出现,导航到网址,登录(到目前为止,它就像镀铬),但它只是给了我手指并说“" 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。我不能成为第一个碰到这个问题的人,但我一直用Google搜索,直到我的眼睛流血,无法找到解决方法。

必须有一些方法可以远程解释本地运行的客户端代码,是吗?这可能不是一个新问题,因为如果我必须创建奇怪的自定义代码,无论我是在本地运行还是它是否是遥控器以及它是否为chrome以及它是否为firefox然后,整个"自动化功能强大且令人敬畏,因为您可以跨环境进行跨浏览器测试和扩展"是一些蛋黄酱芥末包装的芝士蛋糕。那奶油馅?不想要。

2 个答案:

答案 0 :(得分: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命令几乎我读过的所有教程告诉我做的,我会是对此感兴趣。

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

答案 1 :(得分:0)

我也在Windows远程测试中解锁了自己。显然,我需要获取chromedriver.exe和ieserverdriver.exe并将它们放在服务器系统上。在Windows上,您仍然需要启动集线器,但在启动节点时,您需要添加以下参数:

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

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