使用 Selenium 选择多个元素
Selecting multiple elements with 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 个元素,它会在大约 8 到 9 次点击后停止点击事件,并引发此错误:
StaleElementReferenceException
所以只是想知道如何编写将继续单击直到最后一个可用元素而不会失败的方法。
您得到 StaleElementReferenceException
是因为在您执行 FindElements
操作后 DOM 中发生了一些变化。
您提到您正在单击列表中的项目。此单击操作是重新加载页面还是导航到其他页面。在这两种情况下,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();
}
}
希望对您有所帮助。
我正在使用以下 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 个元素,它会在大约 8 到 9 次点击后停止点击事件,并引发此错误:
StaleElementReferenceException
所以只是想知道如何编写将继续单击直到最后一个可用元素而不会失败的方法。
您得到 StaleElementReferenceException
是因为在您执行 FindElements
操作后 DOM 中发生了一些变化。
您提到您正在单击列表中的项目。此单击操作是重新加载页面还是导航到其他页面。在这两种情况下,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();
}
}
希望对您有所帮助。