9

我即将将我的测试自动化语言从 Java 更改为 Ruby(我有一份新工作,其中 Ruby 更适合技术堆栈)。

我在 Java 和 Webdriver 方面有很多经验,但可以看到 Watir 和 Capybara 等包装器在 Ruby 中的使用似乎比直接访问 Webdriver API 更多。

我对使用这样的库的担忧是性能。我通常会尝试将 3rd 方网格(例如 Saucelabs)集成到我的测试框架中,但我了解到 Selenium Web 元素对象的缓存很重要,因为不断查找元素会对性能产生影响。

如果我使用 Capybara 等库,我会失去控制缓存策略的能力吗?我之前调查过 Geb,发现该框架不断地重新创建 web 元素而不是缓存,并且在改变这种行为方面显得不灵活。

我是否担心这些库可以帮助您避免编写样板代码但以性能为代价有效?

4

3 回答 3

3

TL;博士

约定优于配置;使用页面对象进行缓存。


以下是我对此事的看法。请考虑这不是一个答案,而更多的是对讨论的回应。我想要对此答案的反馈,请随时提供。

Ruby 中的主要模式之一(它实际上来自 Rails)是Convention over Configuration。基本思想是,当存在由语言或社区规定的约定时,您会尽可能地遵循它。就您而言,我建议尽可能使用社区框架。这将使其他开发人员更容易使用您的代码,并且在您需要时更容易寻求帮助。

就实际缓存而言,我对此不太熟悉。我知道page-object宝石存储元素而不是在每次使用时重新创建它们*。这似乎符合您对缓存元素的要求。无论如何,我强烈推荐这个 gem,因为它强制执行页面对象模型的测试。

注意:我不确定page-factorymixin 是否支持这种对象缓存,或者它是否在每次使用时重新创建类。

*您可以通过查看类的源代码了解元素是如何存储的。page-objectElement

def initialize(element, platform)
  @element = element
于 2013-09-03T13:14:04.587 回答
3

我一般不会评论性能,因为我没有进行广泛的比较(你不应该真的相信任何不能指出基准的人)。但是,这里有一个性能提示(有或没有包装器):

在内部,WebDriver 使用 HTTP 将命令发送到浏览器(或中间服务器)。由于该协议非常健谈,您通常可以通过将默认的基于 Net::HTTP 的客户端换成支持 Keep-Alive 的客户端(假设服务器支持它)来获得很多好处。这样,Ruby 客户端将为每个浏览器打开一个套接字并在会话期间重复使用它,而不是为每个命令打开一个。

下面是使用 net-http-persistent gem 的代码:

require "selenium/webdriver"
require "selenium/webdriver/remote/http/persistent"

client = Selenium::WebDriver::Remote::Http::Persistent.new
driver = Selenium::WebDriver.for :remote, url: 'http://...', http_client: client
于 2014-02-02T01:47:47.537 回答
2

不幸的是,我不能说关于 Capybara 的任何具体内容,但我可以说关于 watir-webdriver。默认情况下,它总是重新定位页面上的元素,所以你不能缓存它。可以通过以下方式关闭此行为

Watir.always_locate = false

尽管在这种情况下您可能会遇到过时的元素(但是,它实际上更多地取决于您,就像普通的 WebDriver 一样)。如果您计划将 watir-webdriver 与page-objectgem 一起使用,则默认情况下,它的缓存将不会像 @screenmutt 回答中所述那样工作。

此外,Zejlko Fillipn 有两篇关于使用SauceLabsTestingBot时的 watir-webdriver 性能的不错的博客文章。

watir-webdriver 的另一个问题是跨浏览器性能。因为它在底层使用 XPath,所以在 IE 中进行测试时将面临严重的性能问题。

于 2013-09-05T15:51:30.220 回答