【问题标题】:Set up a different wait time for a specific line in the code为代码中的特定行设置不同的等待时间
【发布时间】:2020-02-19 16:17:51
【问题描述】:

我正在使用 appium、java、JUnit 和 maven 项目在 android 上自动执行加载资金操作。为了处理超时异常,我有这样的等待能力:

wait = new WebDriverWait(driver, 15);

我通常会这样写: wait.until(ExpectedConditions.elementToBeClickable(By.id("login_btn"))).click();

这种方法工作得很好,除了一行。我希望我的代码为特定行等待大约 60 秒。因为加载该页面大约需要 60 秒。

    public void loadMoney() {

        successfulLogIn();
        wait.until(ExpectedConditions.elementToBeClickable(By.id("loadBtn"))).click();
        wait.until(ExpectedConditions.elementToBeClickable(By.id("currencyEur"))).click();
        wait.until(ExpectedConditions.elementToBeClickable(By.id("activityLoadMoney_textView_cardLastFourDigit"))).click();
        wait.until(ExpectedConditions.elementToBeClickable(By.id("rowYourCards_card_container"))).click();
        wait.until(ExpectedConditions.elementToBeClickable(By.id("moneyInputLayout_editText_mainCurrencyAmount"))).sendKeys(loadMoneyAmount);
        wait.until(ExpectedConditions.elementToBeClickable(By.id("activityLoadMoney_textView_loadMoney"))).click();
        wait.until(ExpectedConditions.presenceOfElementLocated(By.id("successtext")));
        MobileElement result = driver.findElement(By.id("successtext"));
        Assert.assertEquals((result.getText()), "Successfully sent!");
    }

在上面的代码中,我希望我的代码为此行等待大约 60 秒

wait.until(ExpectedConditions.presenceOfElementLocated(By.id("successtext")));

因为显示此文本大约需要 60 秒。正如我上面提到的,我的等待时间设置为 15 秒。因此我得到 TimeoutException .. 我不想将整个等待时间更改为 60 秒,因为其他方法会花费太多时间。我只希望我的代码专门为此行等待 60 秒。我怎样才能做到这一点?我需要为此编写一个新方法吗?如果有怎么办?

【问题讨论】:

    标签: java mobile automation appium wait


    【解决方案1】:

    你可以这样做

    WebDriverWait wait = new WebDriverWait(driver,10);
    wait.until(ExpectedConditions.elementToBeClickable(By.id("activityLoadMoney_textView_loadMoney"))).click();
    
    wait.wait(60);  // you need to add this line
    
    wait.until(ExpectedConditions.presenceOfElementLocated(By.id("successtext")))
    

    通过这种方式你不要创建WebDriverWait的另一个对象

    注意:如果下一个元素仅在 wait.wait(60); 驱动程序等待时间设置为 60 而不是 10 之后等待 10 秒,则您再次需要将等待时间进一步更改为 10

    【讨论】:

    • 尝试了您的解决方案并添加了 wait.wait(60);在上述行之前。它强调了第二个 wait() 并要求我将 InterruptedException 添加到方法中。我添加了这个异常并再次运行测试。这次我得到了IllegalMonitorStateException,在网上搜索了一下之后,我用Thread.sleep(60000)替换了wait.wait(60);它奏效了。所以你间接地帮助了我。 :) 虽然我确实想用等待而不是睡眠来解决这个问题
    • 然后代替线程创建 WebDriverWait 的另一个对象,因为 wait2 将其值设置为 60,仅将其用于成功文本
    • 根据您的建议,我在方法中创建了这个:WebDriverWait waitFor40Seconds = new WebDriverWait(driver, 40); 然后我为成功屏幕写了这个:waitFor40Seconds.until(ExpectedConditions.elementToBeClickable(By.id("successtext"))); 这给了我超时异常,它不会等待 40 秒,而是等待默认的 15 秒:/
    • 以前有 60 秒的等待时间,为什么现在是 40 秒
    • 我只是想测试一下它是否会等待 40 秒。但它没有。然后我将其更改为 60 秒,它也没有工作。
    猜你喜欢
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多