Как очистить данные с сайта с селеном C #? - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь очистить данные с веб-страницы.Однако у меня возникли проблемы с очисткой всех данных в таблице.Мне нужно переключаться между страницами, чтобы получить все данные, и я хочу получить вывод с помощью DataGridTable.У меня возникают проблемы с выяснением, как это сделать, даже несмотря на изменение количества страниц на сайте.Я хотел бы добавить информацию автоматически на таблицы таблицы данных страниц по страницам.Мой вход (веб-сайт) показывает только 25 элементов.Вот почему у меня есть 25 элементов в DataGridTable.Я хотел бы обосновать «количество страниц» из элемента «кнопка перехода к конечной странице».Так что моя программа знает, сколько страниц нужно соскрести с сайта.но, если есть другой способ, я хочу знать спасибо.

Это мой код на данный момент.

DataTable dt = new DataTable();

        var header = driver.FindElement(By.CssSelector("#gridComponent > div.k-grid-header"));
        foreach (var row in header.FindElements(By.TagName("tr")))
        {
            //Configure Number of Col and row
            int cellIndex = 0;
            string[] arr = new string[32];

            //Get Cell Data
            foreach (var cell in row.FindElements(By.TagName("th")))
            {
                // Check the header cell for a checkbox child. If no
                // such child exists, add the column.
                var headerCheckboxes = cell.FindElements(By.CssSelector("input[type='checkbox']"));
                if (headerCheckboxes.Count == 0)
                {
                    //Number of Col Data Load
                    if (cellIndex <= 29)
                    {
                        arr[cellIndex] = cell.Text;
                        dt.Columns.Add(cell.Text);
                    }
                    else
                    cellIndex++;
                }
            }
            Console.WriteLine(arr);
        }

        var table = driver.FindElement(By.CssSelector("#gridComponent"));

        //Get Row value
        foreach (var row in table.FindElements(By.TagName("tr")))
        {
            //Configure Number of Col and row
            int cellIndex = 0;

            // Use a list instead of an array
            List<string> arr = new List<string>();

            //Get Cell Data
            foreach (var cell in row.FindElements(By.TagName("td")))
            {
                // Skip the first column in the row by checking
                // if the cell index is 0.
                if (cellIndex != 0)
                {
                    string cellValue = "";
                    Console.WriteLine(cell);
                    var checkboxes = cell.FindElements(By.CssSelector("input[type='checkbox']"));
                    if (checkboxes.Count > 0)
                    {
                        bool isChecked = false;
                        isChecked = checkboxes[0].Selected;
                        cellValue = isChecked.ToString();
                    }
                    else
                    {
                        cellValue = cell.Text;
                    }
                    arr.Add(cellValue);
                }
                cellIndex++;
            }
            dt.Rows.Add(arr.ToArray());
        }
        dataGridView1.DataSource = dt;
        driver.FindElement(By.CssSelector("#gridComponent > div.k-pager-wrap.k-grid-pager.k-widget.k-floatwrap > ul > li:nth-child(3)")).Click();
    }

Это таблица, из которой я пытаюсь почистить.

Это код для следующего элемента, показанного на рисунке выше.

<a href="#" aria-label="Go to the last page" title="Go to the last page" class="k-link k-pager-nav k-pager-last" data-page="3" tabindex="-1"><span class="k-icon k-i-arrow-end-right"></span></a>

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Я наконец получил ответ за это.

private List<List<string>> GetRecords(IWebElement table)
    {
        List<List<string>> rows = new List<List<string>>(); ;
        //Get Row value
        foreach (var row in table.FindElements(By.TagName("tr")))
        {
            //Configure Number of Col and row
            int cellIndex = 0;

            // Use a list instead of an array
            List<string> cols = new List<string>();

            //Get Cell Data
            foreach (var cell in row.FindElements(By.TagName("td")))
            {
                // Skip the first column in the row by checking
                // if the cell index is 0.
                if (cellIndex != 0)
                {
                    string cellValue = "";
                    Console.WriteLine(cell);
                    var checkboxes = cell.FindElements(By.CssSelector("input[type='checkbox']"));
                    if (checkboxes.Count > 0)
                    {
                        bool isChecked = false;
                        isChecked = checkboxes[0].Selected;
                        cellValue = isChecked.ToString();
                    }
                    else
                    {
                        cellValue = cell.Text;
                    }
                    cols.Add(cellValue);
                }
                cellIndex++;
            }

            rows.Add(cols);
        }

        return rows;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //Configure to Hide CMD
        var chromeDriverService = ChromeDriverService.CreateDefaultService();
        chromeDriverService.HideCommandPromptWindow = true;

        //Configure to Hide Chrome
        ChromeOptions option = new ChromeOptions();
        option.AddArgument("--headless");

        //HIDING CHROME UN-COMMNET THE SECOND ONE TO SHOW

        //IWebDriver driver = new ChromeDriver(chromeDriverService, option);
        IWebDriver driver = new ChromeDriver();


        driver.Url = "**************";
        driver.Manage().Window.Maximize();
        driver.SwitchTo().DefaultContent();

        //Log-in
        driver.FindElement(By.Id("username")).SendKeys("*****");
        driver.FindElement(By.Id("password")).SendKeys("******" + OpenQA.Selenium.Keys.Enter);

        //Entering Access Code
        driver.FindElement(By.Id("password")).SendKeys("*******");
        driver.FindElement(By.Id("accesscode")).SendKeys("********" + OpenQA.Selenium.Keys.Enter);

        //go to CustomerList
        driver.Navigate().GoToUrl("***********");
        driver.Navigate().GoToUrl("*****************");

        //Wait till load 3 seconds
        waitOnPage(2);

        DataTable dt = new DataTable();

        var header = driver.FindElement(By.CssSelector("#gridComponent > div.k-grid-header"));
        foreach (var row in header.FindElements(By.TagName("tr")))
        {
            //Configure Number of Col and row
            int cellIndex = 0;
            string[] arr = new string[32];

            //Get Cell Data
            foreach (var cell in row.FindElements(By.TagName("th")))
            {
                // Check the header cell for a checkbox child. If no
                // such child exists, add the column.
                var headerCheckboxes = cell.FindElements(By.CssSelector("input[type='checkbox']"));
                if (headerCheckboxes.Count == 0)
                {
                    //Number of Col Data Load
                    if (cellIndex <= 29)
                    {
                        arr[cellIndex] = cell.Text;
                        dt.Columns.Add(cell.Text);
                    }
                    else
                    cellIndex++;
                }
            }
            Console.WriteLine(arr);
        }

        var table = driver.FindElement(By.CssSelector("#gridComponent"));


        List<List<string>> records = GetRecords(table);

        // Supposing you want the footer information
        var lastPageStr = table.FindElement(By.ClassName("k-pager-last")).GetAttribute("data-page");
        var lastPage = Convert.ToInt16(lastPageStr);
        // You can select other info lik this


        // class="k-link k-pager-nav" data-page="1" 
        driver.FindElement(By.CssSelector("#gridComponent > div.k-pager-wrap.k-grid-pager.k-widget.k-floatwrap > ul > li:nth-child(3)")).Click();

        // Cycle over the pages
        for (int p = 0; p < (lastPage - 1); p++)
        {
            driver.FindElement(By.CssSelector("#gridComponent > div.k-pager-wrap.k-grid-pager.k-widget.k-floatwrap > a:nth-child(4) > span")).Click();
            waitOnPage(2);
            var rows = GetRecords(table);
            records.AddRange(rows);
        }

        // Add all rows to DT
        //dt.Rows.Add(records[4].ToArray());
        foreach(var row in records)
        {
            dt.Rows.Add(row.ToArray());
        }

        dataGridView1.DataSource = dt;
    }
0 голосов
/ 06 февраля 2019

Возможно, вы захотите рассмотреть индексную информацию «1 - 25 из 64 элементов», поскольку она является хорошим индикатором общего количества страниц.

Пакет = 1 - 25, то есть 25 элементов на странице.Всего товаров = 64

Нет.of pages = roundup (64/25)

PS: лучший вариант, без каких-либо вычислений, возможно, получить атрибут «data-page» кнопки последней страницы.

...