A couple of issues were seen when locating an element based on its label 
(and/or retrieving the element's label text):

1. Locating the element's label is based on the element's name rather than id.
2. It is only possible to locate text fields based on their label (ie other 
input fields cannot be located by their label).
3. All elements with no name/id attribute, such as when the element is a child 
of its label, are associated with the first label on the page that has no for 
attribute.
4. It is being assumed that the element and label belong to the same container, 
which might not be true when chaining elements.

### 1. Locating the element's label is based on the element's name rather than 
id.

Given the html:

````html
<label for="new_user_first_name" id="first_label">First name</label>
<input name="new_user_first_name" id="new_user_first_name" class="name" />
<label for="new_user_last_name" id="last_label">Last name</label>
<input name="something_else" id="new_user_last_name" class="name" />
````

The correct result when the input name that matches the id:

````ruby
p browser.text_field(:label => 'First name').exists?
#=> true
````

An unexpected result when the input name does not match the id:

````ruby
p browser.text_field(:label => 'Last name').exists?
#=> false
````

### 2. It is only possible to locate text fields based on their label (ie other 
input fields cannot be located by their label).

Given the html:

````html
<input type="checkbox" name="new_user_interests" id="new_user_interests_books" 
value="books" checked="checked" />
<label for="new_user_interests_books">Books</label>
````

It is not possible to find the checkbox by its label (as it appears to be 
comparing a Watir::Label object):

````ruby
p browser.checkbox(:label, 'Books').exists?
#=> false
````

### 3. All elements with no name/id attribute, such as when the element is a 
child of its label, are associated with the first label on the page that has no 
for attribute.

Given the html:

````html
<label>Found <input type="text"></label> 
<label>Lost <input type="text"></label> 
````

The second text field cannot be found by its label text, "Lost", as it appears 
to be associated with the first label's text, "Found".

````ruby
p browser.text_field(:label => /Lost/).exists?
#=> false

p browser.text_field(:index => 1).label
#=> "Found"
````

### 4. It is being assumed that the element and label belong to the same 
container, which might not be true when chaining elements.

Given the html:

````html
<div>
  <span class="label">
    <label for="my_label">My Label</label>
  </span>
  <span class="field">
    <input type="text" name="my_label" id="my_label"/>
  </span>
</div>
````

You can find the text field by its label when the container of the text field 
includes the label:

````ruby
p browser.text_field(:label => 'My Label').exists?
#=> true

p browser.text_field(:name => 'my_label').label
#=> "My Label"
````

However, if you reduce the container to only include the text field, the label 
is no longer found:

````ruby
p browser.span(:class => 'field').text_field(:label => 'My Label').exists?
#=> false

p browser.span(:class => 'field').text_field(:name => 'my_label').label
#=> `assert_exists': Unable to locate element, using {:tag_name=>["label"], 
:for=>"my_label"} (Watir::Exception::UnknownObjectException)
````

---
Reply to this email directly or view it on GitHub:
https://github.com/watir/watir-classic/issues/56
_______________________________________________
Wtr-development mailing list
Wtr-development@rubyforge.org
http://rubyforge.org/mailman/listinfo/wtr-development

Reply via email to