Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2018, 23:31   #1
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию Ошибка при переборе страниц. OpenQA.Selenium.StaleElementReferen ceException element is not attached to the page document

Хочу пройтись по страницам результатов и вытянуть названия лотов с оборотами в dataGridView. При выполнении кода, когда перехожу на следующую страницу iPage, получаю ошибку в разных строках связанных з IWebElement, например ругается на result
Код:
string HTMLpath = result.GetAttribute("href").ToString() ;
Цитата:
Вызвано исключение: "OpenQA.Selenium.StaleElementRefere nceException" в WebDriver.dll
Исключение типа "OpenQA.Selenium.StaleElementRefere nceException" возникло в WebDriver.dll, но не было обработано в коде пользователя
stale element reference: element is not attached to the page document
Не понимаю как елемент result может не принадлежать странице если, он найден и хранится в results, а страница не обновлялась чтобы изменился ID элемента.
Или подскажите как правильно сделать обход страниц только использую Selenium без изучения какой запрос куда отправляется.

Код:
protected void myWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker sendingWorker = (BackgroundWorker)sender;
            for (int iPage = 1; iPage <= PAGECOUNT; iPage++)
            {

                var selector = By.ClassName("market_listing_row_link");
                WebDriverWait ww = new WebDriverWait(browser, TimeSpan.FromSeconds(10));
                ww.Until(ExpectedConditions.ElementIsVisible(selector));

                List<IWebElement> results = 
                        browser.FindElements(By.ClassName("market_listing_row_link")).ToList();
                int resultIndex = 1; //tmp var for result count
                foreach (IWebElement result in results)
                {

                    if (!sendingWorker.CancellationPending)
                    {
                        IWebElement item;
                        IWebElement itemName;
                        IWebElement sName;
                        IWebElement qtyItem;
                        string isName = string.Empty;
                        string iiQty = string.Empty;
                        string HTMLpath = result.GetAttribute("href").ToString() ;
                        if (HTMLpath == string.Empty)
                        {
                            break;
                        }
                        for (int i = 0; i < 5; i++)
                        {
                            try
                            {
                                 item = result.FindElement(By.ClassName("market_listing_searchresult"));
                                 itemName = item.FindElement(By.ClassName("market_listing_item_name_block"));
                                 sName = itemName.FindElement(By.ClassName("market_listing_item_name"));
                                 qtyItem = result.FindElement(By.ClassName("market_listing_num_listings_qty"));

                                isName = sName.Text;
                                iiQty = qtyItem.Text;
                                break;
                            }
                            catch (Exception eX)
                            {
                                Debug.WriteLine(eX.Message);
                            }

                        }

                            List<Operation> Operations = new List<Operation>();
                            using (WebClient client = new WebClient()) // WebClient class inherits IDisposable
                            {

                               // some code here

                            }
                            double gunMaxPrice = Operations[0].OperationPrice;
                            double gunMinPrice = Operations[0].OperationPrice;
                            double gunAvgPrice = 0;
                            int gunSalesPcs = 0;
                            int daysCount = 1;
                            Operation prevOp = Operations[0];
                            foreach (var operation in Operations)
                            {
                                if (operation.OperationPrice > gunMaxPrice)
                                    gunMaxPrice = operation.OperationPrice;
                                if (operation.OperationPrice < gunMinPrice)
                                    gunMinPrice = operation.OperationPrice;
                                if (prevOp.OperationDate.Day != operation.OperationDate.Day)
                                {
                                    daysCount++;
                                    prevOp = operation;
                                }
                                gunSalesPcs += operation.OperationAmount;
                            }
                            gunAvgPrice = (gunMaxPrice + gunMinPrice) / 2;
                            gunSalesPcs = gunSalesPcs / daysCount;

                            DataRow myRow = dataTableForDataGrid.NewRow();
                            string link = result.GetAttribute("href");
                            myRow[0] = isName;
                            myRow[1] = link;
                            myRow[2] = iiQty;
                            myRow[3] = gunMaxPrice;
                            myRow[4] = gunMinPrice;
                            myRow[5] = gunAvgPrice;
                            myRow[6] = gunSalesPcs;

                            dataTableForDataGrid.Rows.Add(myRow);
                            Debug.WriteLine(myRow[0]);
                            dataTableForDataGrid.AcceptChanges();
                    }
                    else
                    {
                        e.Cancel = true;
                        break;
                    }
                    resultIndex++;
                }

                System.Threading.Thread.Sleep(1000); //to avoid microban
                selector = By.Id("searchResults_btn_next");
                ww = new WebDriverWait(browser, TimeSpan.FromSeconds(10));
                ww.Until(ExpectedConditions.ElementIsVisible(selector));
                browser.FindElement(selector).Click();

                sendingWorker.ReportProgress(iPage);
            }
        }
        
        public struct Operation
        {
            public DateTime OperationDate;

            public Double OperationPrice;
            public int OperationAmount;
        }
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указать функцию в List и вызвать ее при переборе accncc C# (си шарп) 22 20.05.2015 22:07
Specified element is already the logical child of another element. Disconnect it first. sealmu WPF, UWP, WinRT, XAML 0 24.02.2011 17:36
Convert error при переборе Horus92 Помощь студентам 1 17.08.2010 22:07
Проблема при переборе списка Spice Общие вопросы C/C++ 3 22.07.2009 08:22
p:element и q:^element - в чем разница? Arkuz Компоненты Delphi 1 21.04.2008 01:16