如何找到带有watir-webdriver的<acronym>标签而不会造成巨大的性能损失?</acronym>

时间:2012-04-10 17:01:04

标签: watir watir-webdriver

我在黄瓜(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 个答案:

答案 0 :(得分:4)

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

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

更新:正如Chuck所说,CSS-Selector也是一个选项:

@browser.element(:css => "acronym[id^=expense_code]")

答案 1 :(得分:4)

该类名是否可预测?你可以从一个设定的部分加上你要验证的文本构建它(在上面的例子中它是一样的)并且那样做吗?

acronym = 'E100'
browser.element(:class, 'editable select fillwith:exp_codes default:#{acronym}'.text.should == acronym

答案 2 :(得分: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

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

答案 3 :(得分: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

感谢您的帮助。 :)

相关问题