这是我第一次从事硒工作,也没有深入了解网络技术方面的经验。(StaleElementException:Selenium)我该如何处理?
解决方法是,当我尝试访问DOM上的特定对象时,我一直面临StaleElementException。
以下方法处理所有任务:
private void extract(WebDriver driver) {
try {
List<WebElement> rows = driver.findElements(By.xpath("//*[@id='gvSearchResults']/tbody/tr"));
for (WebElement row : rows) {
WebElement columns = row.findElement(By.xpath("./td[1]/a"));
if (assertAndVerifyElement(By.xpath("//*[@id='gvSearchResults']/tbody/tr/td[1]/a"))) {
columns.click();
}
List<WebElement> elements = driver
.findElements(By.xpath("//*[@id='ctl00_MainContent_pnlDetailsInd']/table/tbody/tr"));
for (WebElement element : elements) {
WebElement values = element.findElement(By.xpath("./td[1]"));
System.out.print(values.getText() + " ");
WebElement values2 = element.findElement(By.xpath("./td[2]"));
System.out.println(values2.getText());
}
if(assertAndVerifyElement(By.xpath("//*[@id='ctl00_MainContent_btnBack']")))
driver.findElement(By.xpath("//*[@id='ctl00_MainContent_btnBack']")).click();
}
} catch (Exception e) {
e.printStackTrace();
}
}
断言逻辑放在这里:
public boolean assertAndVerifyElement(By element) throws InterruptedException {
boolean isPresent = false;
for (int i = 0; i < 5; i++) {
try {
if (driver.findElement(element) != null) {
isPresent = true;
break;
}
} catch (Exception e) {
// System.out.println(e.getLocalizedMessage());
Thread.sleep(1000);
}
}
Assert.assertTrue("\"" + element + "\" is not present.", isPresent);
return isPresent;
}
我已经试过几个解决方案,要求我用等到预期的条件,但没有一次成功。
此外,如果您指出我可能在上述示例中使用的任何不良设计实践,将不胜感激。
在这行你也看到了'StaleElementException'? – DebanjanB
找出发生了哪个元素'StaleElementException',并使用'WebDriverWait'和'ExpectedConditions'等待该元素。 – sen4ik