Выбор нескольких элементов с помощью 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();
    }
}

Надеюсь, это поможет вам.

Другие вопросы по тегам