XtinaS
XtinaS

Reputation: 194

Can't select label by text when label contains more than text

I am driving myself bonkers with this.

I have three form fields in a form:

  1. Customer: required dropdown field
  2. Weight: required text field
  3. Status: optional text field

Each element has that label. The required fields' labels contain a span with an asterisk.

I'm using Xpather in Chrome. When I search for this, I receive 2 results, when I should get 3:

//*[contains(text(),'t')]

This makes no sense to me At All.

Customer, which is working:

<label for='customer-field'>
  <span class='required-marker'>*</span>
  Customer
  <input id='customer-field' type='text' />
</label>

Weight, which is not working:

<label class='control-label'>
  <span id='ctl01_requiredMarker' class='required-marker'>*</span>
  Weight
</label>

Status, which is working:

<label class='control-label'>
  Status
</label>

The only workaround that works for me is removing the required marker from the Weight label container. However, that doesn't explain how "Customer" gets matched at all.

Noteworthy: I'm trying to automate testing this page, so I can't really remove that span tag.

What's going on? And/or what do I do?

Upvotes: 2

Views: 7264

Answers (4)

user3487861
user3487861

Reputation: 350

Try with the below method

driver.findElement(By.xpath("//span[@class='required-marker']/..")).getText().contains("Weight")

Please Let me know above method is working or not.

Upvotes: 1

Tetrinity
Tetrinity

Reputation: 1105

Try changing your XPath to the following:

//*[text()[contains(.,'t')]]

The source of this fix breaks it down far better than I could've done, so refer to that for detailed explanation! I've tested it myself using the XPath Checker extension for Firefox, and it matches your three items.

Upvotes: 8

nilesh
nilesh

Reputation: 14307

Are you using Selenium or WebDriver? What does WebDriver return as a response? Also make sure you add a "." before the xpath like .//*[contains(text(),'t')]

What does this print?

List<WebElement> elements = driver.findElement(By.xpath(".//*[contains(text(),'t')]"));
s.o.p(elements.size());

Upvotes: 0

Richard
Richard

Reputation: 9029

I think your html is where the issue lies.

This is probably what your html should look like:

<span class='required-marker'>*
    <label for='customer-field'>Customer</label>
    <input id='customer-field' type='text' />
</span>
<span id='ctl01_requiredMarker' class='required-marker'>*
    <label class='control-label'>Weight</label>
</span>
<label class='control-label'>Status</label>

Upvotes: 0

Related Questions