Почему клики по ссылкам для веб-сканирования из списка ссылок действительно медленные? C # - PullRequest
0 голосов
/ 09 мая 2019

Я хочу нажать на все ссылки с текстом «300». Мой код для просмотра веб-страниц нажимает на каждую ссылку очень медленно. Я сохраняю ссылки в списке и нажимаю их по одной.

Я считаю ссылки для индексации, а затем использую для (int pos = 0; pos https://www.w3schools.com/html/default.asp] и очень отзывчивый, но на другом сайте он очень медленный.

class Program
{
    private static IWebDriver driver = null;

    static void Main(string[] args)
    {
        driver = new InternetExplorerDriver();
        driver.Manage().Window.Maximize();
        driver.Navigate().GoToUrl("https://arbitrary.com/");

        clickAllLinks("300");
    }

    //clicking links AND get data
    public static void clickAllLinks(string tagName)
    {
        IWebElement element = 
        driver.FindElement(By.XPath("//div[@class='data']"));

        int elements = 
        element.FindElements(By.PartialLinkText(tagName)).Count();

        for (int pos = 0; pos < elements; pos++)
        {
            getElementWithIndex(By.PartialLinkText(tagName), pos).Click();
            //fetchdata();
        }
    }

    public static IWebElement getElementWithIndex(By by, int pos)
    {
        IWebElement element = 
        driver.FindElement(By.XPath("//div[@class='data']"));
        IList<IWebElement> elements = 
        element.FindElements(By.PartialLinkText("300"));
        return elements.ElementAt(pos);
    }



    //scrape data
    public static async void fetchdata()
    {
        string currentURL = driver.Url; //url to string
        Console.WriteLine("URL: " + currentURL);

        var httpclient = new HttpClient();
        var html = await httpclient.GetStringAsync(currentURL);

        var htmldoc = new HtmlDocument();
        htmldoc.LoadHtml(html); //html to htmldoc

      List<List<string>> Receipt = 
      htmldoc.DocumentNode.SelectSingleNode("//table[@class='classname']")
            //htmldoc into list TABLE->TR->TD->InnerText
            .Descendants("tr")
            .Where(tr => tr.Elements("td").Count() > 0)
            .Select(tr => tr.Elements("td")
            .ToList())
            .ToList();

1 Ответ

0 голосов
/ 10 мая 2019

Вот упрощенная версия вашего clickAllLinks метода. Это уменьшит накладные расходы в ваших текущих методах (получение элементов и ненужное хранение, что может повлиять на скорость выполнения).

//clicking links AND get data
public static void clickAllLinks(string tagName)
{
    int elements = 
    driver.FindElements(By.xpath("//div[@class='data']//a[contains(.," + tagName + ")]").Count();

    for (int pos = 1; pos < elements; pos++)
    {
        driver.FindElements(By.xpath("(//div[@class='data']//a[contains(.," + tagName + ")])[" +  pos + "]").Click();
        //fetchdata();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...