正如标题所述,我正在尝试对元素执行操作(即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
我想象这是一个无形的等待循环,但似乎无法弄清楚。
任何正确方向的指针都会有很大的帮助。
答案 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");