我在黄瓜(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>
如果我能改进测试的性能,我将不胜感激。
答案 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
感谢您的帮助。 :)