报错stale element reference: element is not attach

https://docs.seleniumhq.org/exceptions/stale_element_reference.jsp 

页面元素过期,引用的元素过时,不再依附于当前页面,需要重新定位获取元素对象

如果JavaScript把网页给刷新了,那么操作的时候就会碰到Stale Element Reference Exception

1,用executeScript 等待元素加载显示完成并点击

@Keyword

def public void JavaScriptClick(WebElement element) {

WebDriver driver = DriverFactory.getWebDriver()

jsexecutor = (JavascriptExecutor) driver;

try {

// 判断传入的element元素是否处于可单击状态,以及是否能显示在页面上

if (element.isEnabled() && element.isDisplayed()) {

System.out.println("使用JavaScript进行页面元素的单击");

// 执行JavaScript语句arguments[0].click();

//argumets[0]表示第一个参数,即element

jsexecutor.executeScript("arguments[0].click();", element);

} else {

System.out.println("页面上的元素无法进行单击操作");

}

} catch (StaleElementReferenceException e) {

// e是Throwable的实例异常对象,用在catch语句中,相当于一个形参,一旦try捕获到了异常,那么就将这个异常信息交给e,由e处理

// TODO: handle exception

System.out.println("页面元素没有附加在网页中"+e.getStackTrace());

} catch (NoSuchElementException e) {

// TODO: handle exception

System.out.println("在页面中没有找到要操作的元素"+e.getStackTrace());

} catch (Exception e) {

// TODO: handle exception

System.out.println("无法完成单击动作"+e.getStackTrace());

}

}

note:getStackTrace()

getStackTrace()返回的是通过getOurStackTrace方法获取的StackTraceElement[]数组,而这个StackTraceElement是ERROR的每一个cause by的信息。

   printStackTrace()返回的是一个void值,但是可以看到其方法内部将当前传入打印流锁住,然后同样通过getOurStackTrace方法获取的StackTraceElement[]数组,只不过printStackTrace()方法直接打印出来了。而getStackTrace()则是得到数组,使用者可以根据自己的需求去得到打印信息,相比printStackTrace()会更细一些。

2.先判断元素是否显示,在对元素进行操作

public Boolean isDisplay(final String xpath, final String text) {

        logger.info("等待指定元素文本显示");

        boolean result = false;

        int attempts = 0;

        while (attempts < 5) {

            try {

                attempts++;

                logger.info("扫描开始元素开始第" + attempts + "次");

                result = new WebDriverWait(driver, 30)

                        .until(new ExpectedCondition() {

                            public Boolean apply(WebDriver driver) {

                                return driver.findElement(By.xpath(xpath)).getText().contains(text);

                            }

                        });

                logger.info("扫描开始元素结束");

                return true;

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

        return result;

    }

你可能感兴趣的:(报错stale element reference: element is not attach)