我们可以在ExplicitWait预期条件中传递条件参数吗?

时间:2017-07-21 08:12:48

标签: java selenium selenium-webdriver

This is网站。我要做的是,单击按钮并获取显示系统IPAddress的文本。

我能够找到<span>的元素,但是一旦点击了获取IP地址按钮就会显示文本。

所以我关心的是我们可以在ExplicitWait中使用条件吗?例如

 driver.findElement(By.id("lblIPAddress")).getText().length()>0

这是我想在ExplicitWait中使用的条件参数。

我在显式等待中使用textToBePresentInElement方法,但在这里我必须传递该字符串(IP Address: 123.201.110.30)硬编码。

WebDriverWait wait = new WebDriverWait(driver, 120);
wait.until(ExpectedConditions.textToBePresentInElement(driver.findElement(By.id("lblIPAddress")), "IP Address: 123.201.110.30"));

即使我能够通过加载程序的invisibilityOf()方法获取文本,但一旦隐藏,它的跨度就会显示IPAddress文本。

wait.until(ExpectedConditions.invisibilityOf(driver.findElement(By.xpath("//div[@class='modal12']"))));
System.out.println("IP address After wait = "+ driver.findElement(By.id("lblIPAddress")).getText());

但我的查询是在显式等待中使用条件,等待给定时间检查条件(检查元素中是否有天气文本)。

这是代码:

public static void main(String args[])
{

    System.setProperty("webdriver.chrome.driver", "D:\\Application\\chromedriver.exe");
    driver = new ChromeDriver(); 
    driver.manage().window().maximize();
    driver.get("https://www.aspsnippets.com/demos/1331/");
    driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
    driver.findElement(By.id("btnGet")).click();
    System.out.println(driver.findElement(By.id("lblIPAddress")).getText().length());
    System.out.println("IP Address = "+ driver.findElement(By.id("lblIPAddress")).getText());       
    WebDriverWait wait = new WebDriverWait(driver, 120);
    wait.until(ExpectedConditions.textToBePresentInElement(driver.findElement(By.id("lblIPAddress")), "IP Address: 123.201.110.30"));
    System.out.println("IP address After wait = "+ driver.findElement(By.id("lblIPAddress")).getText());

}

3 个答案:

答案 0 :(得分:2)

我不认为您可以在显式等待(预期条件)中使用条件,但是,您可以在FluentWait中使用任何自定义条件。

如果您使用的是Java 8,则可以编写一个具有条件并执行它的函数。

对于你的情况,你可以写这样的东西。

@Test
public void testFluentWait(){

    driver = new ChromeDriver();
    driver.get("https://www.facebook.com/");
    WebElement element = driver.findElement(By.name("websubmit"));

    waitUntilElementHasText(element);

    //If you are using Java 8
    waitUntilCondition(() -> element.getAttribute("type").contains("submit"));

}

//Only if you are using Java 8
public boolean waitUntilCondition(Callable<Boolean> condition){

    Wait wait = new FluentWait<WebDriver>(driver)
            .withTimeout(30, TimeUnit.SECONDS)
            .pollingEvery(5, TimeUnit.SECONDS)
            .ignoring(NoSuchElementException.class);


    wait.until(new Function<WebDriver, Boolean>() {
        public Boolean apply(WebDriver driver) {
            try {
                return condition.call();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
        }
    });

    return false;
}

public boolean waitUntilElementHasText(final WebElement element){

    Wait wait = new FluentWait<WebDriver>(driver)
            .withTimeout(30, TimeUnit.SECONDS)
            .pollingEvery(5, TimeUnit.SECONDS)
            .ignoring(NoSuchElementException.class);


    wait.until(new Function<WebDriver, Boolean>() {
        public Boolean apply(WebDriver driver) {
            return element.getText().length() > 0;
        }
    });

    return element.getText().length() > 0;
}

答案 1 :(得分:0)

您可以使用ExpectedConditions来处理这个问题。 .textToBePresentInElementLocated()是部分文本匹配,可用于等待IP出现。出现后,您可以使用元素上的.getText()来获取它。下面的代码正在工作并输出&#34; IP地址:x.x.x.x&#34;。

driver.findElement(By.id("btnGet")).click();
new WebDriverWait(driver, 10).until(ExpectedConditions.textToBePresentInElementLocated(By.id("lblIPAddress"), "IP Address:"));
System.out.println(driver.findElement(By.id("lblIPAddress")).getText());

答案 2 :(得分:0)

我知道回答这个晚了,但我按照以下方法尝试了

公共类 TestFluentWait {

public static void main(String[] args) {
    
    WebDriverManager.chromedriver().setup();
    WebDriver driver = new ChromeDriver();
    driver.get("https://www.aspsnippets.com/demos/1331/");
    driver.findElement(By.id("btnGet")).click();
    
    Wait<WebDriver> wait = new WebDriverWait(driver,30);        
    WebElement ele = wait.until( new Function<WebDriver,WebElement>()
            {
                public WebElement apply(WebDriver driver)
                    {
                        WebElement reElement= driver.findElement(By.id("lblIPAddress"));
                        if(reElement.getText().length()>0)
                            return reElement;
                        else
                            return null;
                    }
            }
        );
    System.out.println("Text Is:"+ele.getText());
    driver.quit();
}

}

它也适用于 FluentWait。

    Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
            .withTimeout(Duration.ofSeconds(30))
            .pollingEvery(Duration.ofSeconds(5)).
            ignoring(NoSuchElementException.class);