SlappingTheBass12
SlappingTheBass12

Reputation: 377

Click on parent element based on two conditions in child elements Selenium Driver

Using Selenium 4.8 in .NET 6, I have the following html structure to parse.

<ul class="search-results">
  <li>
    <a href=//to somewhere>
      <span class="book-desc">
       <div class="book-title">some title</div>
       <span class="book-author">some author</span>
      </span>
    </a>
  </li>
</ul>

I need to find and click on the right li where the book-title matches my variable input (ideally ignore sentence case too) AND the book author also matches my variable input. So far I'm not getting that xpath syntax correct. I've tried different variations of something along these lines:

var matchingBooks = driver.FindElements(By.XPath($"//li[.//span[@class='book-author' and text()='{b.Authors}' and @class='book-title' and text()='{b.Title}']]"));

then I check if matchingBooks has a length before clicking on the first element. But matchingBooks is always coming back as 0.

enter image description here

Upvotes: 1

Views: 517

Answers (1)

Prophet
Prophet

Reputation: 33351

class="book-author" belongs to span while class="book-title" belongs to div child element.
Also it cane be extra spaces additionally to the text, so it's better to use contains instead of exact equals validation.
So, instead of "//li[.//span[@class='book-author' and text()='{b.Authors}' and @class='book-title' and text()='{b.Title}']]" please try this:

"//li[.//span[@class='book-author' and(contains(text(),'{b.Authors}'))] and .//div[@class='book-title' and(contains(text(),'{b.Title}'))]]"

UPD
The following XPath should work. This is a example specific XPath I tried and it worked "//li[.//span[@class='book-author' and(contains(text(),'anima'))] and .//div[@class='book-title' and(contains(text(),'Coloring'))]]" for blood of the fold search input.
Also, I guess you should click on a element inside the li, not on the li itself. So, it's try to click the following element:

"//li[.//span[@class='book-author' and(contains(text(),'{b.Authors}'))] and .//div[@class='book-title' and(contains(text(),'{b.Title}'))]]//a"

Upvotes: 1

Related Questions