Хочу пройтись по
страницам результатов и вытянуть названия лотов с оборотами в 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;
}