使用PageFactory

时间:2018-10-21 04:28:37

标签: java selenium pageobjects page-factory staleelementreferenceexception

使用Pagefactory时,我直接声明了WebElement,如下所示。

@AndroidFindBy(accessibility = "androidLocator")
@iOSFindBy(accessibility = "iosLocator")
private MobileElement element;

但是,有没有办法处理StaleElementReference异常,因为我在这里没有使用任何By对象。我能找出的所有解决方案都要求我将定位器用作By的对象。

我想在所有处理StaleElementReferenceException的页面类的父类中编写一个通用方法。但是问题是我只能将引用作为WebElement而不是作为By对象传递,这超出了重新初始化WebElement的目的。

我可以找到以下解决方案:

FluentWait<MobileDriver<MobileElement>> wait = new FluentWait<MobileDriver<MobileElement>>(driver)
                        .withTimeout(20, TimeUnit.SECONDS).pollingEvery(500, TimeUnit.MILLISECONDS)
                        .ignoring(NoSuchElementException.class).ignoring(StaleElementReferenceException.class);
                wait.until(new Function<WebDriver, MobileElement>() {
                    @Override
                    public MobileElement apply(WebDriver driver) {
                        element.get
                        MobileElement element = driver.findElement(by);
                        return element;
                    }
                });

但是,这里也会发生同样的问题。我需要将引用作为By对象传递,而在PageFactory中我将引用作为WebElemrnt

4 个答案:

答案 0 :(得分:1)

无论是Appium还是普通的旧硒,我对陈旧元素的解决方案始终是确保我正在使用一个新实例化的页面对象。

如果您要通过测试方法共享页面对象,或者某些内容可能会更改页面状态,那么重新初始化页面对象就不会受到损害。

但是,您不会显示页面对象初始化代码。您的页面初始化是什么样的?

答案 1 :(得分:0)

您可以使用refreshed df = df.set_index(df.timestamp.dt.time) df['rush'] = df.index.isin(df[t(0,6,0):t(0,9,0)].index | df[t(0,15,30):t(0,19,0)].index) df = df.reset_index(drop=True) 等待元素在DOM中重新绘制

function addElementals(element, parent)
{
//to add at end of parent
parent.appendChild(element);
//to add at beginning of parent
//parent.insertBefore(element,parent.childNodes[0]);
}

let newElemental = document.createElement('div');
newElemental.setAttribute('id', 'user_name');
newElemental.innerHTML = "i'm from jupiter";

//and someID must be exactly same as your html ID. As @Jaromanda X mentioned someID!=someId
let referencePoint = document.getElementById('someID');
addElementals(newElemental, referencePoint);

答案 2 :(得分:0)

您可以将命令放在try ... catch块中,如果捕获到StaleElementReference异常,请使用 driver.navigate.refresh()刷新页面,然后再次执行相同的操作。

>

如果您的元素将在一段时间后自动刷新,那么您也可以在这种情况下使用ExpectedConditions。

wait.until(ExpectedConditions.refreshed(ExpectedConditions.stalenessOf(element)));

答案 3 :(得分:0)

您可以使用try catch块,在try中,可以使用常规的selenium方法等待并单击。然后可以使用JavascriptExecutor单击该元素。

private WebDriverWait webDriverWait;

public WebElement waitForElement(WebDriver driver, WebElement element) {
    try {
        webDriverWait = new WebDriverWait(driver, 10);
        webDriverWait.until(ExpectedConditions.elementToBeClickable(element));
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return element;
}

public void click(WebDriver driver, WebElement element) {
    try {
        waitForElement(driver, element).click();
    } catch (Exception ex) {
        ex.printStackTrace();
        JavascriptExecutor js = (JavascriptExecutor) driver;
        js.executeScript("arguments[0].click();", element);
    }
}

我希望这可以解决您的问题。谢谢。