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());
}
答案 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);