之前再讲解Selenium 元素等待时,丢过一个问题,怎么才能再项目中真正做到智能等待呢?
其实这里我们需要自己对框架进行简单二次封装。
想达到这效果有两种方式:
- 重新封装常用的动作,封装的每个动作都加上等待,这样你写case时调用自己封装的方法自然就会等待
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.presenceOfElementLocated(by));
driver.click();
上面这种方式可以达到效果,但是麻烦了点,这里教另一种方式,虽然同样要重写每个常用方法,但是代码量会少很多。
- 细想下,我们查找元素都是通过findElement 或者 findElements 方法对吧。 那如果我们重新封装下findElement 让这个方法去等待元素加载是不是就方便很多了。
我们具体看下重新封装findElement方法:
import com.frame.logger.LoggerControler;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.util.List;
/**
* Created by 米阳 on 2017/10/16.
*/
public class Find extends SeleniumDriver{
final static LoggerControler log = LoggerControler.getLogger(Find.class);
public static WebElement findElement(final By by) {
WebElement webElement = null;
try {
webElement = new WebDriverWait(driver, 10).until(new ExpectedCondition<WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(by);
}
});
} catch (Exception e) {
log.error("元素:" + by + "查找超时");
e.printStackTrace();
}
return webElement;
}
public static List<WebElement> findElements(final By by) {
List<WebElement> webElement = null;
try {
webElement = new WebDriverWait(driver, 10).until(new ExpectedCondition<List<WebElement>>() {
public List<WebElement> apply(WebDriver driver) {
return driver.findElements(by);
}
});
} catch (Exception e) {
log.error("元素:" + by + "查找超时");
e.printStackTrace();
}
return webElement;
}
}
接着我们重新封装我们的常用操作方法:
public static void click(By by, String... text) {
Find.findElement(by).click();
if (text.length > 0) {
log.info("点击:" + text[0]);
} else {
log.info("点击:" + by);
}
}
public static void clear(By by) {
Find.findElement(by).clear();
log.info("清空" + by);
}
public static void sendText(By by, String text) {
WebElement element = Find.findElement(by);
element.clear();
element.sendKeys(text);
log.info("在" + by + "输入" + text);
}
这样以后再写Case时就可以直接调用自己封装的动作方法了:
public void sendKeysPWD() {
Action.clear(pwdFiled);//pwdFiled 定位方式
Action.sendText(pwdFiled, "pwd");
}
最后我之前授课时简单对Selenium做了二次封装,集成了 log4j ,testng,extentreports(一个很漂亮的报告)大伙可以参考,这个框架有个很大问题,driver静态的,所以无法实现并发。。。 大家有兴趣自己搞搞。
https://github.com/MeYoung/WebUIAutomation_Selenium