简体   繁体   中英

Selenium : xpath following-sibling where siblings have more children

I hope I describe my problem/question in a comprehensible way.

I have and html that looks like this:

 <div class="class-div"> <label class="class-label"> <span class="class-span">AAAA</span> </label> <div class="class-div-a"> <textarea class="class-textarea"> </textarea> </div> </div> <div class="class-div"> <label class="class-label"> <span class="class-span">BBBB</span> </label> <div class="class-div-a"> <textarea class="class-textarea"> </textarea> </div> </div> 

I want the Xpath for the TextArea where the value of the Label is AAAA to populate it with a value in Selenium.

So somelike like this...

wait.Until(ExpectedConditions.ElementIsVisible(
    By.XPath("//div[@class='class-div']/label[@class='class-label'][span[@class='class-span' and text()='AAAA']]/following-sibling::div[@class='class-div-a']/textarea[@class='class-textarea']"))).SendKeys(valueTextArea);

Problem could be in this waiter condition, ExpectedConditions.ElementIsVisible

The thing is that your <textarea> is not 'visible' in selenium context, visibility means that element is present in DOM (which is true) and it's size is greater then 0px which could be false for your <textarea> element. In java you would use ExpectedConditions.presenceOfElement() instead of ExpectedConditions.visibilityOfElement() , not sure how it goes in C# but you get the picture.

Try and see if it solves your problem.

Let me quickly rephrase the question to make sure I understand, you need an xpath to find the textbox associated with the label where the text is AAAA .

You'll have to go back up the tree in this case, here are a couple of ways I might do that, although your xpath looks correct:

Using ancestor to be clear about which element you're moving up to (better IMO)

By.XPath("//label/span[text()='AAAA']/ancestor::div[@class='class-div']//textarea");

Or just moving back up the tree with ..

By.XPath("//label/span[text()='AAAA']/../../..//textarea");

If your xpath exists, use asikojevics answer. The C# method is ExpectedConditions.ElementExists(By)

****UPDATE****

Based on your comment of a trailing space after the text value, here is another xpath that should find the textarea in that case, using contains instead of text()= .

By.XPath("//label/span[contains(text(),'AAAA')]/ancestor::div[@class='class-div']//textarea");

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM