2 つの状態class="icon"
またはのいずれかになる要素がありますclass="icon active"
。
アクティブでない最初のボタンをクリックすると思ったのです$browser.element(:class => /^icon$/).click
が、「アクティブ」が含まれているかどうかに関係なく、最初に見つかったボタンをクリックするだけです。
正規表現は間違っていますか?またはさらに良いことに、それを行う非正規表現の方法はありますか?
2 つの状態class="icon"
またはのいずれかになる要素がありますclass="icon active"
。
アクティブでない最初のボタンをクリックすると思ったのです$browser.element(:class => /^icon$/).click
が、「アクティブ」が含まれているかどうかに関係なく、最初に見つかったボタンをクリックするだけです。
正規表現は間違っていますか?またはさらに良いことに、それを行う非正規表現の方法はありますか?
コメントで述べたように、使用した正規表現は watir-webdriver で機能するはずです。ただし、watir-classic と watir-webdriver の両方で機能するソリューションが必要な場合は、find
.
b.elements.find{ |e| e.class_name == 'icon'}.click
これは、'class' 属性が正確に 'icon' である要素にのみ一致します。
これは遅くて読みにくいですが、watir-classic の方法をバイパスしてクラスを一致させることができます。以下に示すように、watir-classic は正規表現が要素のクラスのいずれかと一致することを確認します。
def match_class? element, what
classes = element.class_name.split(/\s+/)
classes.any? {|clazz| what.matches(clazz)}
end
正規表現を使用できない場合、別のオプションとして、一致するアイテムのコレクションを取得し、それらをより詳細に調べて、機能するアイテムを見つけたらクリックし、その時点でコレクションを破棄します。
browswer.elements(:class => "icon").each do |possible|
unless possible.attribute_value("class").include? "active"
possible.click
break
end
end
私は常に の大ファンというわけではありませんunless
が、この場合は読みやすいコードになるので、それを使用しました
トラブルシューティングのために、そのコレクション内の要素のクラス情報に何が表示されているかを見てみましょう
browswer.elements(:class => "icon").each do |possible|
puts possible.attribute_value("class")
end