В моем приложении C # для использования веб-драйвера selenium я получаю эту ошибку:
OpenQA.Selenium.StaleElementReferenceException: устаревший элемент ссылка: элемент не прикреплен к документу страницы
в этом коде:
IWebElement e = driver.FindElement(By.XPath(link_click), 10);
e.Click();
строка ошибки находится в e.Click ()
, но это процедура, которая успешно выполнялась по той же ссылке, указанной XPath ранее, но не выполнялась при последней попытке! так что означает эта ошибка и как ее исправить ?
Это означает, что либо элемент изменен на странице, либо элемент удален, полная ссылка в этой ссылке http://www.seleniumhq.org/exceptions/stale_element_reference.jsp
Один из способов справиться с этим, вы можете поставить повторный анализ, возможно, что-то вроде
bool staleElement = true;
while(staleElement){
try{
driver.FindElement(By.XPath(link_click), 10).Click();
staleElement = false;
} catch(StaleElementReferenceException e){
staleElement = true;
}
}
У меня была та же проблема, когда я делал сборщик дат, с одним из сайтов. Я бы получил все активные (или включенные) кнопки в списке выбора даты и щелкнул каждую из них. Когда я повторял элементы, это становилось несвежим. Я бы повторил, сохранив другой список. Это могло произойти, потому что однажды List < WebElement > получает селен не возвращает его обратно. Ниже приведен фиксированный код
@Test
public void datePickerTest() throws InterruptedException{
driver.get(baseURL);
// click on flights tab
genericMethod.getElement("tab-flight-tab-hp", "id").click();
// click departing date, such that the date picker is loaded in the dom
genericMethod.getElement("flight-departing-hp-flight", "id").click();
Thread.sleep(700);
// pass the collected xpath where you can find all the dates which are enabled
String xpath=".//*[@id='flight-departing-wrapper-hp-flight']/div/div/div[2]/table/tbody/tr/td/button[not(@disabled)]";
List<WebElement> activeDatesWebElement = genericMethod.getElements("xpath", xpath);
System.out.println("Number of Active Dates " + activeDatesWebElement.size());
// work around for an element when it is found stale
List<String> activeDateListAsString = new ArrayList<String>();
for(WebElement temp : activeDatesWebElement){
activeDateListAsString.add(temp.getText());
}
// iterate all element in the list received, which is kept in list
for(String temp : activeDateListAsString){
genericMethod.getElement("flight-departing-hp-flight", "id").click();
Thread.sleep(500);
String selectDateXpath=".//*[@id='flight-departing-wrapper-hp-flight']"
+ "/div/div/div[2]/table/tbody/tr/td/button[text()='"
+temp+"']";
genericMethod.getElement(selectDateXpath, "xpath").click();
Thread.sleep(500);
}
}
Вы получаете эту ошибку, если элемент отсутствует при загрузке страницы. Вам нужно подождать, пока элемент не будет готов:
public static Func<IWebDriver, IWebElement> Condition(By locator)
{
return (driver) => {
var element = driver.FindElements(locator).FirstOrDefault();
return element != null && element.Displayed && element.Enabled ? element : null;
};
}
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
var elementU = wait.Until(Condition(By.Name("j_username")));
elementU.Click();