Joe
Joe

Reputation: 626

Selenium XPath Query - FindElement After Text

I am trying to get a link in a website which changes name on a daily basis. The structure is similar to this (but with many more levels):

<li>
   <div class = "contentPlaceHolder1">
      <div class="content">
         <p>
            <strong>'Today's File Here:<strong>
         </p>
      </div>
   </div>
</li>
<li>...<li>
<li>...<li>
<li>...<li>
<li>
  <div class = "contentPlaceHolder1">
      <div class="content">
         <div class="DocLink">
            <li>
               <a href = "http://changingURL" class="txtLnk">Download</a>
            </li>
         </div>
      </div>
   </div>
</li>
<li>...<li>

etc...

If I find the text (which will remain constant) which is immediately above it in the page by using

IWebElement foundTextElement = chrome.FindElement(By.XPath("//p/strong['Today's File Here:']"));

How can I find the next link in the page by using XPath (or alternative solution)? I am unsure of how to search for the next element after this.

If I use

IWebElement link = chrome.FindElement(By.XPath("//a[@class='txtLnk'"));

then this finds the first link in the page. I only want the first occurance of it after 'foundTextElement'

I have had it working by navigating up the tree to the parent above <li>, and finding the 4th sibling using By.XPath("following-sibling::*[4]/div/div/div/li/a[@class='txtLnk']") but that seems a little precarious to me.

I could parse the HTML until it finds the next occurrence in the html, but was wondering whether there is a more clever way of doing this?

Thanks.

Upvotes: 0

Views: 104

Answers (2)

Vitaliy Moskalyuk
Vitaliy Moskalyuk

Reputation: 2583

You can try this xpath. It's complicated, as we don't see the rest of the page to optimize it

//li[preceding-sibling::li[.//*[contains(text(),'File Here')]]][.//a[contains(@class,'txtLnk')]][1]

it searches first li which has inside a tag with txtLnk class and it is first found followed after li element with text containing File Here

Upvotes: 2

Moe Ghafari
Moe Ghafari

Reputation: 2267

By.XPath("//a[@class='txtLnk'")

Is a very generic selector, there might be other elements on the page using the same class

You can find this using a CssSelector, try this:

IWebElement aElement = chrome.FindElement(By.CssSelector("div.contentPlaceHolder1 div.content div.DocLink li a"));

Then you can get the href using:

string link = aElement.getAttribute("href") ;  

Upvotes: 0

Related Questions