java - 如何克服状态元素引用异常
问题描述
我正在尝试自动化以下操作:
- 启动https://www.flipkart.com > 单击手机 > 将鼠标悬停在电子设备上,然后单击 Mi。
我在线程“主”状态元素参考中得到期望:元素未附加到 miButton() 方法中的页面文档。
请参阅错误详细信息部分。
HTML 代码
基类:
public class Base {
static WebDriver driver;
public void setupBrowser(String browser, String url) {
String currDir = System.getProperty("user.dir");
if(browser.equalsIgnoreCase("chrome")) {
System.setProperty("webdriver.chrome.driver", currDir + "\\drivers\\chromedriver.exe");
driver = new ChromeDriver();
}
else if(browser.equalsIgnoreCase("firefox")) {
System.setProperty("webdriver.gecko.driver", currDir + "\\drivers\\geckodriver.exe");
driver = new FirefoxDriver();
}
else if(browser.equalsIgnoreCase("edge")) {
System.setProperty("webdriver.edge.driver", currDir + "\\drivers\\msedgedriver.exe");
driver = new EdgeDriver();
}
else {
System.out.println("Valid browser not found therefore quitiing");
System.exit(0);
}
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
if(url != "")
driver.get(url);
else
driver.get("about:blank");
}
public void closeBrowser() {
driver.close();
}
页面类
public class pagetest extends Base{
Actions action;
public void closebtn() {
driver.findElement(By.cssSelector("button._2doB4z")).click();
}
public void mibutton() {
WebElement mobiles = driver.findElement(By.xpath("//div[text()='Mobiles']"));
action = new Actions(driver);
action.moveToElement(mobiles).click().perform();
WebElement electronicsmenu = driver.findElement(By.xpath("//span[text()='Electronics']"));
action.moveToElement(electronicsmenu).click().perform();
List <WebElement> value = driver.findElements(By.xpath("//div[@class='_1kidPb']/div[@class='_1QrT3s']//a");
for(WebElement elem:value) {
if(elem.getText().equals("Mi")) {
elem.click();
}
}
WebElement label = driver.findElement(By.xpath("//p[text()='Latest from MI : ']"));
System.out.println("The Label 'Latest from MI' is present : " +label.isEnabled());
}
public static void main(String[] args) {
pagetest obj = new pagetest();
obj.setupBrowser("chrome", "https://www.flipkart.com/");
obj.closebtn();
obj.mibutton();
}
}
错误详情
线程“main” org.openqa.selenium.StaleElementReferenceException 中的异常:过时的元素引用:元素未附加到页面文档(会话信息:chrome=89.0.4389.90)有关此错误的文档,请访问:https://www .seleniumhq.org/exceptions/stale_element_reference.html
解决方案
您永远不会找到元素,然后立即尝试单击它们。当页面加载时,元素被创建,但在几毫秒后它们会改变它们的属性、大小和/或位置。此异常意味着您找到了该元素,但到目前为止您“丢失”了它。
为了避免 StateElementReferecneException 使用 WebDriverWait 对象。您可以等待元素可见/可点击以及其他选项。最好的选择是等待元素可点击:
WebDriverWait wait = new WebDriverWait(driver, 20, 10);
wait.until(ExpectedConditions.elementToBeClickable
(By.id("elementID")));
推荐阅读
- angular - Chart.js 不显示任何数据
- docker - 使用 Skaffold 构建多架构 docker 镜像
- matlab - 从大脑活动数据中提取不同的频带(α、β、γ)
- python - 如何使用 re.findall 提取文本?
- swift - 调用子类中的任何方法时如何调用基类方法?
- c# - C# 互操作 GetNamedPipeClientProcessId ERROR_NOT_FOUND 1168 (0x490)
- javascript - 在 Soho 模板中获取博主帖子缩略图的问题
- http - cpprestsdk http 凭据设置收到 401 错误
- azerothcore - 移除 5 秒法力回复规则艾泽拉斯之核
- dart - Flutter 归档插件 Dart 用于循环结束条件