原文链接: http://stackoverflow.com/questions/5948881/locating-a-li-element-using-text-using-watir-webdriver
Question
I am trying to locate and click on a jQuery menu element, the menu is defined as multiple UL elements containing a number of LI elements.
Using Firefox 3.6.17 on Mac 10.5, in standard WATIR I've used;
browser.li(:text,"Options...").click
or
browser.div(:id,"Attributes-menu").li(:text,"Copy").click
to click on the menu item but using watir-webdriver (0.2.3) it is reporting the LI element cannot be found. Although I can find the containing DIV and an instance of LI by using :class.
I've attached an example of a menu HTML below, can anyone suggest a reliable method of locating the LI item?
<div class="ws-menu-container ws-context-menu ws-context-menu-hidden" style="top: 16px; left: 214px; " id="Attributes-menu">
<ul class="ws-context-menu"><li class="ws-context-menu-disable"> Copy </li></ul>
<hr class="ws-context-menu-separator">
<ul class="ws-context-menu">
<li class="ws-context-menu-disable"> Add... </li>
<li class="ws-context-menu-disable"> Remove... </li></ul>
<hr class="ws-context-menu-separator">
<ul class="ws-context-menu">
<li class="ws-context-menu-disable"> Clear Translation Flag </li>
<li class="ws-context-menu-disable"> Copy from Master Language... </li>
<li class="ws-context-menu-disable"> Push to Child Languages... </li></ul>
<hr class="ws-context-menu-separator">
<ul class="ws-context-menu">
<li class="ws-context-menu"> Options... </li></ul>
<hr class="ws-context-menu-separator">
<ul class="ws-context-menu">
<li class="ws-context-menu"> Refresh </li></ul>
<hr class="ws-context-menu-separator">
<ul class="ws-context-menu">
<li class="ws-context-menu"> Help </li></ul></div>
Answers
A1:
This worked for me:
browser.div(:id => "Attributes-menu").li(:text => /Copy/).click
A2:
The reason it's not found is the nbsp;'s. In addition to Željko's regexp solution, you should be able to do this by adding the Unicode bytes for a non-breaking space to the string you're looking for, e.g:
browser.li(:text => "\xc2\xa0\xc2\xa0\xc2\xa0Options...\xc2\xa0\xc2\xa0\xc2\xa0")
A3:
To do Zeljko's solution but using a string variable you need to create a new instance of the regular expression class from your string variable
searchtext = Regexp.new(mystringvariable)
browser.div(:id => "Attributes-menu").li(:text => searchtext).click
for more info see the Rdoc for the Ruby Regexp class