【问题标题】:Get the href link of an element with classname having spaces获取类名有空格的元素的href链接
【发布时间】:2021-10-27 07:56:02
【问题描述】:

我一直在尝试使用类名获取元素的链接,但总是收到未找到元素的错误

List<IWebElement> LinkElements =  Selenium.Selenium.driver.FindElementsByClassName("column.wrap-text").ToList();

我设法使用下面的代码获得了我想要的链接,但我知道这不是一个好方法。

try
    {
            Selenium.Selenium.driver.Navigate().GoToUrl(txt_url.Text);

            List<IWebElement> LinkElements = Selenium.Selenium.driver.FindElementsByTagName("a").ToList();

            List<string> ValidLinks = new List<string>();

            foreach (IWebElement LinkElement in LinkElements)
            {
                string LinkString = LinkElement.GetAttribute("href");
                if (LinkString != null)
                {
                    if (LinkString.Contains("documents"))
                    {
                        list.Items.Add(LinkString);
                    }
                }
            }
        }
        catch (Exception)
        { }

下面是我要提取带有标题名称的 href 链接(“/view/garnimii@/Testing%20Folder/MyFile.txt”)的元素的 html 代码。我已经尝试了所有可能的方法,但无法使用 findbyclassname 或 findbyxpath 读取元素(这里非常模糊)。谁能帮我解决这个问题?

 <div class="wrapper fluid-element">
 <div class="wrapper fluid-element">
 <div class="wrapper fluid-element">
 <div class="column wrap-text">
 <a title="MyFile.txt"  href="https://drive.corp.amazon.com/documents/garnimii@/Testing%20Folder/MyFile.txt">MyFile.txt</a 
>
</div>
</div>
<div class="column actions resource-actions-view">
<a data-turbolink="true" href="/view/garnimii@/Testing%20Folder/MyFile.txt"><i class="fa fa- 
external-link"></i> View
</a></div>
<div class="column actions resource-actions-share">
<a data-target="#resource-modal-share" data-toggle="modal" 
href="/share/garnimii@/Testing%20Folder/MyFile.txt">
<i class="fa fa-share-alt"></i> Share
</a>
</div>
<div class="column actions resource-actions-rename resource-header-actions">
<a data-resource-basename="MyFile.txt" data-resource-id="8a520062-5dbe-46ba-b4b0-b672f6481c17"         
 data-root-path="/" data-target="#resource-modal-rename" data-toggle="modal" href="#resource- 
 modal-rename">
 <i class="fa fa-pencil"></i> Rename
 </a>
 </div>
 </div>
 </div>

更新

   foreach (IWebElement LinkElement in LinkElements)
   { 
       string LinkString = LinkElement.GetAttribute("title");  
       if (LinkString != null) 
       { 
         if(LinkString.Contains("myfile.txt"))
         {  
            list.Items.Add(LinkString.GetAttribute('href'));
         }
       }
    }

【问题讨论】:

    标签: c# winforms selenium


    【解决方案1】:

    FindElementsByClassName 可以通过单个类名定位元素。
    对于多个类名,您应该使用 XPath 或 CSS 选择器。
    所以不是

    List<IWebElement> LinkElements =  Selenium.Selenium.driver.FindElementsByClassName("column.wrap-text").ToList();
    

    尝试使用

    List<IWebElement> LinkElements =  Selenium.Selenium.driver.FindElementsByCssSelector("div.column.wrap-text").ToList();
    

    【讨论】:

    • cssselector 仅用于获取内容。但是当循环它并尝试获取 title="MyFile.txt" 的链接时,使用获取属性时我无法获取任何链接。不知道我哪里出错了。我们可以使用 FindElementsByCssSelector("a.title") 之类的东西吗
    • 您可以在looping and trying to get the link where title="MyFile.txt" 的位置显示您的代码吗?我想我知道问题出在哪里,但是您没有在问题详细信息中表明这一点
    • 啊,是的。就是那个问题。由于两者之间的差距,我无法首先阅读这些元素。所以无法更进一步。但我也会采用与 href 相同的方法来获取标题。我知道这不起作用,但我确实尝试过
    • foreach(LinkElements 中的 IWebElement LinkElement){ string LinkString = LinkElement.GetAttribute("title"); if (LinkString != null) { if (LinkString.Contains("myfile.txt")) { list.Items.Add(LinkString.GetAttribute('href')); } } }
    • 所有这些元素都显示在屏幕上/视图内还是应该滚动到它们?您为驱动程序设置的屏幕尺寸是多少?
    【解决方案2】:

    您甚至可以尝试使用//a xpath。

    List<IWebElement> LinkElements = Selenium.Selenium.driver.FindElementsByXpath("//a");
    
    List<string> ValidLinks = new List<string>();
    
    foreach (IWebElement LinkElement in LinkElements){
            Console.WriteLine(LinkElement.GetAttribute('href'))
    }
    

    首先使用href 打印所有GetAttribute。如果您的输出包含所有 href,那么我们可以进一步添加到其他列表中。

    更新:

    string LinkString = Selenium.Selenium.driver.FindElementByXpath("//a[@title='MyFile.txt']").GetAttribute('href')
    

    【讨论】:

    • 这是我已经粘贴在我的问题中的内容。不想要这种方法,因为如果其中的文件更多,它将增加从整个页面获取所有链接的时间
    • 你正在使用 Selenium,我们在网页中有多少个a 标签? Selenium 也将有视口。它不会加载页面中的所有a 标签。
    • 很多。据我所知,就像 113 一样。循环遍历所有这些将占用大量内存和时间。我可以使用任何 xpath 或 css 选择器直接获取 title=myfile.txt 的 href 链接吗?
    • 使用这个 xpath : //a[contains(@title,'MyFile')],它没有 1、2、3,所以它将匹配包含该 myfile 的所有可见节点
    • 那么你将不得不使用//a[@title] 来代表所有带有title 属性的a 标签
    猜你喜欢
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多