java 使用WebDriver临时绕过隐式等待

lyfkaqu1  于 2023-08-02  发布在  Java
关注(0)|答案(7)|浏览(125)

当使用隐式等待时,as advised here,我仍然 * 有时 * 想要Assert元素的立即不可见性或不存在。
换句话说,我 * 知道 * 一些元素应该被隐藏,并且希望我的测试使Assert * 快速 *,而不需要花费几秒钟,因为(否则有用的)隐式等待。
我尝试的一件事是这样的一个助手方法:

// NB: doesn't seem to do what I want
private boolean isElementHiddenNow(String id) {
    WebDriverWait zeroWait = new WebDriverWait(driver, 0);
    ExpectedCondition<Boolean> c = invisibilityOfElementLocated(By.id(id));
    try {
        zeroWait.until(c);
        return true;
    } catch (TimeoutException e) {
        return false;
    }
}

字符串
但是在上面的代码中,对until()的调用只在隐式等待时间过去后返回,也就是说,它没有做我想要的事情。
这是目前为止我发现的唯一有效的方法:

@Test
public void checkThatSomethingIsNotVisible()  {
    turnOffImplicitWaits();
    // ... the actual test
    turnOnImplicitWaits();
}


其中,例如turnOffImplicitWaits()是Selenium超类中的一个helper:

protected void turnOffImplicitWaits() {
    driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
}


但我觉得这不太优雅。是否有更清晰的方法偶尔绕过隐式等待?

tjvv9vkg

tjvv9vkg1#

鉴于Selenium似乎不能直接提供我想要的东西(基于Mike Kwan和Slanec所说的),这个简单的助手方法就是我现在使用的方法:

protected boolean isElementHiddenNow(String id) {
    turnOffImplicitWaits();
    boolean result = ExpectedConditions.invisibilityOfElementLocated(By.id(id)).apply(driver);
    turnOnImplicitWaits();
    return result;
}

private void turnOffImplicitWaits() {
    driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
}

private void turnOnImplicitWaits() {
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}

字符串
如果元素被隐藏或根本不存在,则该方法返回true;如果它是可见的,则返回false。无论哪种方式,检查都是立即完成的。
使用上面的方法至少要比调用turnOffImplicitWaits()turnOnImplicitWaits()的测试用例本身更简洁。
另请参阅以下答案,了解相同方法的微调版本:

7cwmlq89

7cwmlq892#

我还建议将参数更改为“By”定位器,以便在查找元素时具有更大的灵活性。

protected boolean isElementHiddenNow(By locator) {
    turnOffImplicitWaits();
    boolean result = false;
    try {
       result = ExpectedConditions.invisibilityOfElementLocated(locator).apply(driver);
    }
    finally {
       turnOnImplicitWaits();
    }
    return result;
}

字符串
这样,如果需要的话,你可以通过css搜索,而不仅仅是id:

By PartLinkLocator = By.cssSelector("div.search-result div.row a");


当然,你的定位器应该被设计成只返回一个元素(不像我快速抓取的“By”示例,它返回css表格中的所有部分链接……)

By usernameLocator = By.id("inputEmail");
myResult = isElementHiddenNow(usernameLocator);

xzv2uavs

xzv2uavs3#

我的实现:

using (driver.NoImplicitWait())
{
    ....
}

字符串
使用扩展方法:

public static NoImplicitWait NoImplicitWait(this IWebDriver driver)
{
    return new NoImplicitWait(driver);
}


和类:

public sealed class NoImplicitWait : IDisposable
{
    private readonly IWebDriver _driver;

    public NoImplicitWait(IWebDriver driver)
    {
        _driver = driver;
        _driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(0));
    }

    public void Dispose()
    {
        _driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(30));
    }
}

3b6akqbq

3b6akqbq4#

@Jonic的回答帮助了我,但是我会添加一个try { } finally { },并在finally块中调用turnOnImplicitWaits(),以确保它总是打开。

protected boolean isElementHiddenNow(String id) {
    turnOffImplicitWaits();
    boolean result = false;
    try {
       result = ExpectedConditions.invisibilityOfElementLocated(By.id(id)).apply(driver);
    }
    finally {
       turnOnImplicitWaits();
    }
    return result;
}

字符串

ldxq2e6h

ldxq2e6h5#

我的方法是完全绕过隐式等待,并在我自己的findElement()findElements()方法中重新实现它(添加可见性检查等),我现在默认使用这些方法。这样,当我想立即检查一些东西时,我可以调用原始的WebDriver方法,当然,它不会等待。

ocebsuys

ocebsuys6#

在一个现有的代码中,大量依赖于隐式等待的思维方式,并且没有CSS来拯救,我找到了一种解决这种事情的方法,用Jsoup补充它,并继续使用Jsoup:

# this is straightforward Scala... put the types and it is Java.
val innerHtml = seleniumWebElementFatherInstance.getAttribute("innerHTML")
val jsoupElements = Jsoup.parse(innerHtml).select("div.your.css.selector")

字符串

31moq8wy

31moq8wy7#

覆盖或临时跳过隐式等待。Selenium不提供任何直接的解决方案,因为这些是静态值。

为了实现这一点,我们需要一个本文中提到的解决方案How to skip the implicit wait for some element in Selenium in JAVA

相关问题