Есть ли способ (в C #) для перебора элементов статьи в HTML веб-сайта? - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь перебрать элементы на странице, и все они классифицируются под ключевым словом 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 Puffy Zip Up Jacket . Ключевые слова похожи на: 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 голосов
/ 03 октября 2019

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, внутри для каждого цикла первое, что вы получаететекст каждого элемента по element.Text, затем вы проверяете условие (сравните, если он содержит текст, который вам нужен), если да, то нажмите.

var values = new [] {"Honda", "Fox", "Puffy"};
foreach (IWebElement element in FindNestedElements())
            {
                if(values.Any(element.Text.Contains);)
                {
                    element.click;
                }
0 голосов
/ 03 октября 2019

Я бы сохранил список ключевых слов в строковом массиве. Затем возьмите каждый тег 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;
    }
}
0 голосов
/ 03 октября 2019

Как-то так?:

    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"))

итерируйтеи выполнить клик в зависимости от условия?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...