Выбор нескольких элементов с помощью Selenium
Я создаю список всех доступных элементов ниже Xpath.
IList<IWebElement> test= Driver.FindElements(By.XPath("//*[@id='middle-container']//div[@class='middle-section match-list']//div[contains(@class,'title')]//span[contains(text(),'" + Event.Trim() + "')]//..//..//..//..//div[contains(@class,'drop-down-content')]//table[contains(@class,'hidden-xs')]//tr//td[contains(@class,'bettype')]//a[@class='bet']`//span"));
Поэтому нужно щелкнуть все элементы, доступные в этом Xpath. Бег foreach
цикл:
foreach (var item in availableSports)
{
item.Click();
}
}
Моя проблема, скажем, если тест содержит больше, чем, я думаю, 10 элементов, он останавливает событие click после примерно 8-9 кликов и вызывает эту ошибку:
StaleElementReferenceException
Так что просто интересно, как я могу написать метод, который будет продолжать щелкать до последнего доступного элемента в обязательном порядке.
1 ответ
Вы получаете StaleElementReferenceException
потому что что-то изменилось в DOM после того, как вы выполнили FindElements
операция.
Вы упомянули, что вы нажимаете на элементы в списке. Делает ли это действие щелчка, чтобы перезагрузить страницу или перейти на другую страницу. В обоих случаях DOM изменился. Отсюда и исключение.
Вы можете справиться с этим (надеюсь) с помощью следующей логики. Я парень JAVA, и следующий код в JAVA. Но я думаю, вы поняли идею.
IList<IWebElement> test= Driver.FindElements(By.XPath("//*[@id='middle-container']//div[@class='middle-section match-list']//div[contains(@class,'title')]//span[contains(text(),'" + Event.Trim() + "')]//..//..//..//..//div[contains(@class,'drop-down-content')]//table[contains(@class,'hidden-xs')]//tr//td[contains(@class,'bettype')]//a[@class='bet']`//span"));
// Instead of using the for each loop, get the size of the list and iterate through it
for (int i=0; i<test.length; i++) {
try {
test.get(i).click();
} catch (StaleElementReferenceException e) {
// If the exception occurs, find the elements again and click on it
test = test= Driver.FindElements(By.XPath("//*[@id='middle-container']//div[@class='middle-section match-list']//div[contains(@class,'title')]//span[contains(text(),'" + Event.Trim() + "')]//..//..//..//..//div[contains(@class,'drop-down-content')]//table[contains(@class,'hidden-xs')]//tr//td[contains(@class,'bettype')]//a[@class='bet']`//span"));
test.get(i).click();
}
}
Надеюсь, это поможет вам.