【问题标题】:Selenium XPath Query - FindElement After TextSelenium XPath 查询 - 文本后的 FindElement
【发布时间】:2017-09-22 22:59:19
【问题描述】:

我正在尝试在一个每天更改名称的网站中获取链接。结构与此类似(但有更多级别):

<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' 之后第一次出现

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

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

谢谢。

【问题讨论】:

    标签: c# selenium xpath


    【解决方案1】:

    你可以试试这个 xpath。这很复杂,因为我们没有看到页面的其余部分来优化它

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

    它首先搜索li,它内部有a 标记和txtLnk 类,它首先在li 元素之后找到,其文本包含File Here

    【讨论】:

    【解决方案2】:
    By.XPath("//a[@class='txtLnk'")
    

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

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

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

    然后您可以使用以下方法获取href:

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

    【讨论】:

    • 嗨萌。感谢您的回答。使用 CssSelector 会有同样的问题吗?如果页面上方/下方还有其他元素具有相同的 Css?
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签