Selenium XPath查询 - 文本后的FindElement

时间:2017-09-22 14:20:33

标签: c# selenium xpath

我想在网站上获取一个每天更改名称的链接。结构类似于此(但有更多级别):

<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...

如果我使用

找到页面正上方的文本(将保持不变)
IWebElement foundTextElement = chrome.FindElement(By.XPath("//p/strong['Today's File Here:']"));

如何使用XPath(或替代解决方案)找到页面中的下一个链接?我不确定如何在此之后搜索下一个元素。

如果我使用

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

然后找到页面中的第一个链接。我只想在'foundTextElement'

之后首次出现它

我已经通过将树导航到<li>上方的父级,并使用By.XPath("following-sibling::*[4]/div/div/div/li/a[@class='txtLnk']")找到第4个兄弟,但这对我来说似乎有些不稳定。

我可以解析HTML直到它在html中找到下一个匹配项,但是想知道是否有更聪明的方法可以做到这一点?

感谢。

2 个答案:

答案 0 :(得分:2)

您可以尝试使用此xpath。它很复杂,因为我们没有看到页面的其余部分来优化它

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

首先搜索li内部带有a类的txtLnk标记li,然后首先在File Here元素后面找到包含{{1}}的文字

答案 1 :(得分:0)

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

是一个非常通用的选择器,页面上可能有其他元素使用相同的类

你可以使用CssSelector找到它,试试这个:

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

然后你可以使用:

获得href
{{1}}