有没有一种方法(C#)来遍历网站HTML上的文章元素?

时间:2019-10-03 15:21:29

标签: c# html selenium selenium-webdriver

我正在尝试遍历页面上的元素,并且所有这些元素都归类在html <article>关键字下。我该怎么办?

<article>
 <div class="inner-article">
  <a style="height:150px;" href="/shop/jackets/v87vh6cpt/rnv032l4i">
   <img width="150" height="150" 
   src="//assets.supremenewyork.com/179529/vi/4DVL66YDwcs.jpg" 
   alt="4dvl66ydwcs"> 
   <div class="sold_out_tag">sold out</div>
  </a>
<h1>
 <a class="name-link" 
 href="/shop/jackets/v87vh6cpt/rnv032l4i">Supreme®/Honda®/Fox® Racing Puffy 
 Zip Up Jacket</a>
 </h1>
  <p>
   <a class="name-link" href="/shop/jackets/v87vh6cpt/rnv032l4i">Black</a>
  </p>
 </div>
</article>

简而言之,我需要遍历页面上的一堆元素(上面列出了HTML代码),并使用关键字来针对innerHTML测试关键字:Supreme®/ Honda®/Fox®Racing蓬松拉链夹克。关键字如下:Honda,Fox和Puffy。

如果一个元素与2个或多个关键字匹配,则它会单击该元素。

do
            {
                driver.Navigate().Refresh();
                try
                {
                    driver.FindElement(By.LinkText("Breed Crewneck"));
                    elementFound = true;
                }catch(NoSuchElementException error)
                {
                    Console.WriteLine("No such element found!");
                }
            } while (elementFound == false);

这是我当前的代码。它仅在页面中查找LinkText元素。 是可行的,因为它需要特定的字符串; LinkText选项不能使用关键字。此外,它是对/错的条件语句。我需要实现迭代。

3 个答案:

答案 0 :(得分:1)

是这样吗?:

    var driveroptions = new ChromeOptions();
                driveroptions.AddUserProfilePreference("disable-popup-blocking", "true");

                using (IWebDriver driver = new ChromeDriver(this.SeleniumDriverPath, driveroptions))
                {
                    try
                    {
                        driver.Navigate().GoToUrl("http://www.google.com/");
                        IWebElement query = driver.FindElement(By.Name("q"));
                        query.SendKeys("link");
                        query.Submit();
                        var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
                        //
                        var listElement = driver.FindElements(OpenQA.Selenium.By.XPath(".//*[@id='search']//div[@class='g']"));
                        foreach( var e in listElement)
                        {
                            //include ctrl+click:
                            //var action = new OpenQA.Selenium.Interactions.Actions(driver);
                            //action.KeyDown(Keys.Control).Build().Perform();
                            //or click:
                            if ("Supreme®/Honda®/Fox® Racing Puffy Zip Up Jacket".Contains(e.Text))
                            {
                                e.Click();
                            }
                        }
                        //
                    }
                    driver.Quit();
                }

基本上,您可以通过XPath找到元素:

    driver.FindElements(OpenQA.Selenium.By.XPath(".//*article//a[@class='name-link']"));

或按类名:

    driver.FindElements(OpenQA.Selenium.By.ClassName("name-link"))

重复并根据条件执行点击?

答案 1 :(得分:1)

1)您将获得所有文章中所有链接的列表

  protected IList<IWebElement> FindNestedElements()
            {
             return FindElement(By.XPath("your xpath for 
     class="name-link" element")).FindElements(By.XPath("your Xpath for article elements"));
            }

2)一旦您收集了页面上所有文章中的所有名称,就执行foreach循环,在每个循环中首先进行ur获取每个element.Text元素的文本,然后检查一下条件(比较是否包含文本u如果需要,请点击。

var values = new [] {"Honda", "Fox", "Puffy"};
foreach (IWebElement element in FindNestedElements())
            {
                if(values.Any(element.Text.Contains);)
                {
                    element.click;
                }

答案 2 :(得分:-1)

我将关键字列表存储在字符串数组中。然后抓住每个A标签下的每个ARTICLE标签(其中包含产品名称,例如“Supreme®/Honda®/Fox®Racing Puffy  Zip Up Jacket”),然后使用LINQ对该字符串中的关键字数进行计数。如果计数> = 2,则单击该元素。代码如下。

string[] keywords = { "Honda", "Fox", "Puffy" };
foreach (IWebElement link in _driver.FindElements(By.CssSelector("article a.name-link")))
{
    if (keywords.Count(w => link.Text.Contains(w)) >= 2)
    {
        link.Click();
        break;
    }
}