我有硒问题。我会尽力解释我的设置以及我想要做的事情。
使用ruby webdriver gem在本地运行我的自动化测试工作正常。通过selenium-server独立jar(无论是远程还是本地)运行完全相同的脚本,如果没有代码中的奇怪更改,就无法运行。
基本摘要:"我觉得自己喜欢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然后,整个"自动化功能强大且令人敬畏,因为您可以跨环境进行跨浏览器测试和扩展"是一些蛋黄酱芥末包装的芝士蛋糕。那奶油馅?不想要。
答案 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。