AndroidElement和WebDriver等待方法问题

时间:2016-11-01 17:22:49

标签: java selenium appium

我希望能够在我的移动自动化套件中使用多个时间相同的方法。意味着每次我只调用Method并仅更新“elementName”(AndroidElement)。

我试过了:

 public void waitForScreenToLoad(AndroidElement elementName){
        (new WebDriverWait(driver,30)).until(ExpectedConditions.presenceOfElementLocated(By.id(elementName.getId())));
    }

在我的测试中,我将这样称呼

MessageCenterScreen message = new MessageCenterScreen(driver);

base.waitForScreenToLoad(message.addCardButton);

但是我的测试失败了,因为它找不到存在的元素。

我使用Page Factory模型来定位元素

   @FindBy(id = "widget_loading_fab_button")
        public AndroidElement addCardButton;

这种方式效果很好,但问题是:我不想一直复制我的方法。

public void waitForCardManagementScreenToLoad() {
        (new WebDriverWait(driver, 30)).until(ExpectedConditions.presenceOfElementLocated(By.id("widget_loading_fab_button")));
    } 

2 个答案:

答案 0 :(得分:0)

  public void waitForScreenToLoad(AndroidElement element){
        (new WebDriverWait(driver,30)).until(ExpectedConditions.visibilityOf(element));
    }

使用 ExpectedConditions.visibilityOf

答案 1 :(得分:0)

我会在之前的post

中粘贴我帮助某人的内容

我使用带有默认时间的时间参数创建一个基本的waitUntil方法。

    private void waitUntil(ExpectedCondition<WebElement> condition, Integer timeout) {
    timeout = timeout != null ? timeout : 5;
    WebDriverWait wait = new WebDriverWait(driver, timeout);
    wait.until(condition);
}

然后我可以使用该辅助方法创建等待显示或等待可点击的。

    public Boolean waitForIsDisplayed(By locator, Integer... timeout) {
    try {
        waitUntil(ExpectedConditions.visibilityOfElementLocated(locator),
                (timeout.length > 0 ? timeout[0] : null));
    } catch (org.openqa.selenium.TimeoutException exception) {
        return false;
    }
    return true;
}

您可以使用elementToBeClickable执行类似操作。

    public Boolean waitForIsClickable(By locator, Integer... timeout) {
    try {
        waitUntil(ExpectedConditions.elementToBeClickable(locator),
                (timeout.length > 0 ? timeout[0] : null));
    } catch (org.openqa.selenium.TimeoutException exception) {
        return false;
    }
    return true;
}

因此,我们可以使用点击方法来执行点击操作:

    public void click(By locator) {
    waitForIsClickable(locator);
    driver.findElement(locator).click();               
}

我制作waitForIsDisplayed和waitForIsClickable的原因是因为我可以在我的断言中重用那些使它们不那么脆弱的原因。

assertTrue("Expected something to be found, but that something did not appear",
            waitForIsDisplayed(locator));

此外,您可以使用方法中指定的默认时间(5秒)使用wait方法,或者可以执行:

waitForIsDisplayed(locator, 20);

在抛出异常之前,这将等待最多20秒。