4

我在 Cucumber (1.1.9) 测试中使用 watir-webdriver (0.5.3)。我正在尝试验证<acronym>标签的文本值。该代码是遗留代码,并且有计划将其更改为<div><span>标记,但同时我必须处理它。我第一次尝试:

@browser.acronym(:id => /expense_code(.*)/).text

我收到以下错误:

NoMethodError: undefined method `acronym' for #<Watir::Browser:0x33e9940>

我在 Watir 代码中四处寻找标签对象是如何创建的,发现它们似乎是根据 HTML5 规范动态创建的,但后来我还发现一条评论element.rb指出它们不再是从规范创建的. 无论如何,我看不到继承<span>对象并将其称为<acronym>对象的简单方法。因此,我研究了替代方案,并找到了元素对象。

@browser.element(:id => /expense_code(.*)/).text

此代码有效,但遍历我的页面大约需要一分钟。我现在坚持使用正则表达式,因为标签 id 实际上是动态生成的,我目前没有办法找出这些值。这就是标签的实际外观:

<acronym class="editable select fillwith:exp_codes default:E100"
title="Expense Code: Expenses" id="expense_code114_582_10777">
E100    </acronym>

对于如何提高测试性能的任何想法,我将不胜感激。

4

4 回答 4

4

使用 XPath 将元素限制为仅是首字母缩略词标签是否有助于提高性能?

@browser.element(:xpath, "//acronym[contains(@id, 'expense_code')]")

更新:正如 Chuck 提到的,CSS-Selector 也是一个选项:

@browser.element(:css => "acronym[id^=expense_code]")
于 2012-04-10T19:21:00.647 回答
4

那个类名是可预测的吗?你能从一个集合部分加上你要验证的文本来构造它(在你上面的例子中是一样的)然后走那条路吗?

acronym = 'E100'
browser.element(:class, 'editable select fillwith:exp_codes default:#{acronym}'.text.should == acronym
于 2012-04-10T19:33:19.253 回答
2

我最近从 Watir 1.6.5 窃取逻辑来为我的页面对象制作自定义定位器/集合,我在 Watir::TaggedElementLocator 中注意到,它支持元素支持的任何方法。在 Watir-Webdriver 中注意到元素有一个 tag_name() 方法,我想我会尝试同样的方法,它看起来很有效。

因此,您可以通过以下方式使用 tag_name 作为定位器:

@browser.element(:tag_name => 'acronym', :id => /expense_code(.*)/).text

我不确定定位器的运行顺序,因此由于正则表达式很昂贵,因此获取所有首字母缩写词元素然后找到具有正确 ID 的元素可能会更快:

@browser.elements(:tag_name, 'acronym').find{ |acronym|
  acronym.id =~ /expense_code(.*)/ 
}.text

虽然我认为它使代码看起来更好,但不幸的是我不确定它是否更快。我猜每个的性能将取决于被测试的特定页面布局。

于 2012-04-11T13:54:47.977 回答
1

我不确定这里的礼仪是什么,但这是我在#watir IRC 聊天中使用 Chuck 的回复和来自 jarib 的反馈得出的答案。以我所有的例子,expense_code = 'E100'.

@browser.element(:tag_name => "acronym", 
                    :class => "default:#{expense_code}").text

上面的代码以非常合理的速度运行,并且不需要 xpath。它是以下代码的缩写:

@browser.element(:tag_name => "acronym", 
     :class => "editable select fillwith:exp_codes default:#{expense_code}").text

我了解到我不需要传递整个字符串。由空格分隔的类中的任何内容都由 watir 优雅地处理。我从这个 xpath 改编了该代码:

@browser.element(:xpath => "//acronym[contains(@class,
    \'editable select fillwith:exp_codes default:#{expense_code}\')]").text

上面代码中的问题是需要避开'类值周围的值,以便它能够正确评估。

只是搜索类(下面的代码)不起作用。我不知道为什么。我确实注意到它用请求冲击了数据库。不管它在做什么,页面都不喜欢它。虽然它多次尝试的原因是我wait_until_present在里面滑了一个。

@browser.element(:class, "editable select fillwith:exp_codes
    default:#{expense_code}").text

谢谢您的帮助。:)

于 2012-04-11T19:30:59.620 回答