我如何等待基于API调用出现和消失的页面加载器在对元素执行操作之前消失

时间:2018-04-30 19:31:20

标签: java selenium-webdriver

正如标题所述,我正在尝试对元素执行操作(即sendkeys或click等),但加载器(具有ID)使操作不一致。

我已经尝试了很多不同的方法,现在我使用线程睡眠进行了一种花哨的方法,这种方法一致地工作,但是仍然会偶尔向前推进误报,导致测试失败。

在API调用完成后向页面中消除了加载器(id =" spinner")(向脚本发送信号表明它可以继续),但是在下一次调用开始时,加载程序返回,然后在(当前)3个API调用完成后消失。无论实施了多少次呼叫,我都想设计一种方法。

public void Loader()
{    
   WebDriverWait wait=new WebDriverWait(driver,50);
   WebElement CPloader = driver.findElement(By.id("spinner"));
   boolean test = wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("spinner")));         

   if(test==false) {
       wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("spinner")));
       wait.until(ExpectedConditions.invisibilityOf(CPloader));
       threadsleep(2000);
       wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("spinner")));
       wait.until(ExpectedConditions.invisibilityOf(CPloader));
       threadsleep(2000);
       wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("spinner")));
       wait.until(ExpectedConditions.invisibilityOf(CPloader));
   }

}

在测试脚本代码中,我通常会使用loader方法,threadsleep,loader方法试图让它保持足够长的时间,但我知道这不是正确的......下面的例子:

Util.Loader();
Util.threadsleep(2000);
Util.Loader();
//click element or send keys etc

我想象这是一个无形的等待循环,但似乎无法弄清楚。

任何正确方向的指针都会有很大的帮助。

2 个答案:

答案 0 :(得分:1)

我会通过等待加载器出现然后消失来接近它...并在循环中执行此操作。一旦加载器停止出现,等待将抛出TimeoutException。使用try-catch捕获并突破循环。您可能需要根据加载微调器之间通常需要多长时间来调整10s等待或向下调整。

public static void Loader()
{
    By loader = By.id("spinner");
    WebDriverWait wait = new WebDriverWait(driver, 10);
    while (true)
    {
        try
        {
            wait.until(ExpectedConditions.visibilityOfElementLocated(loader));
            wait.until(ExpectedConditions.invisibilityOfElementLocated(loader));
        }
        catch (Exception e)
        {
            break;
        }
    }
}

答案 1 :(得分:0)

如前所述加载器(具有ID)使操作不一致所以不是为加载器调用invisibilityOfElementLocated()方法,而是可以为所需的方法调用elementToBeClickable()方法您打算按如下方式调用click()sendKeys()的元素:

  • 使用 cssSelector 点击

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("cssSelector_of_element_to_interact"))).click();
    
  • 使用 xpath sendKeys

    new WebDriverWait(driver, 30).until(ExpectedConditions.elementToBeClickable(By.xpath("xpath_of_element_to_interact']"))).sendKeys("Test");