之前再讲解Selenium 元素等待时,丢过一个问题,怎么才能再项目中真正做到智能等待呢?
    其实这里我们需要自己对框架进行简单二次封装。

    想达到这效果有两种方式:

    1. 重新封装常用的动作,封装的每个动作都加上等待,这样你写case时调用自己封装的方法自然就会等待
    1. WebDriverWait wait = new WebDriverWait(driver, 30);
    2. wait.until(ExpectedConditions.presenceOfElementLocated(by));
    3. driver.click();

    上面这种方式可以达到效果,但是麻烦了点,这里教另一种方式,虽然同样要重写每个常用方法,但是代码量会少很多。

    1. 细想下,我们查找元素都是通过findElement 或者 findElements 方法对吧。 那如果我们重新封装下findElement 让这个方法去等待元素加载是不是就方便很多了。

    我们具体看下重新封装findElement方法:

    1. import com.frame.logger.LoggerControler;
    2. import org.openqa.selenium.By;
    3. import org.openqa.selenium.WebDriver;
    4. import org.openqa.selenium.WebElement;
    5. import org.openqa.selenium.support.ui.ExpectedCondition;
    6. import org.openqa.selenium.support.ui.WebDriverWait;
    7. import java.util.List;
    8. /**
    9. * Created by 米阳 on 2017/10/16.
    10. */
    11. public class Find extends SeleniumDriver{
    12. final static LoggerControler log = LoggerControler.getLogger(Find.class);
    13. public static WebElement findElement(final By by) {
    14. WebElement webElement = null;
    15. try {
    16. webElement = new WebDriverWait(driver, 10).until(new ExpectedCondition<WebElement>() {
    17. public WebElement apply(WebDriver driver) {
    18. return driver.findElement(by);
    19. }
    20. });
    21. } catch (Exception e) {
    22. log.error("元素:" + by + "查找超时");
    23. e.printStackTrace();
    24. }
    25. return webElement;
    26. }
    27. public static List<WebElement> findElements(final By by) {
    28. List<WebElement> webElement = null;
    29. try {
    30. webElement = new WebDriverWait(driver, 10).until(new ExpectedCondition<List<WebElement>>() {
    31. public List<WebElement> apply(WebDriver driver) {
    32. return driver.findElements(by);
    33. }
    34. });
    35. } catch (Exception e) {
    36. log.error("元素:" + by + "查找超时");
    37. e.printStackTrace();
    38. }
    39. return webElement;
    40. }
    41. }

    接着我们重新封装我们的常用操作方法:

    1. public static void click(By by, String... text) {
    2. Find.findElement(by).click();
    3. if (text.length > 0) {
    4. log.info("点击:" + text[0]);
    5. } else {
    6. log.info("点击:" + by);
    7. }
    8. }
    9. public static void clear(By by) {
    10. Find.findElement(by).clear();
    11. log.info("清空" + by);
    12. }
    13. public static void sendText(By by, String text) {
    14. WebElement element = Find.findElement(by);
    15. element.clear();
    16. element.sendKeys(text);
    17. log.info("在" + by + "输入" + text);
    18. }

    这样以后再写Case时就可以直接调用自己封装的动作方法了:

    public void sendKeysPWD() {
            Action.clear(pwdFiled);//pwdFiled 定位方式
            Action.sendText(pwdFiled, "pwd");
        }
    

    最后我之前授课时简单对Selenium做了二次封装,集成了 log4j ,testng,extentreports(一个很漂亮的报告)大伙可以参考,这个框架有个很大问题,driver静态的,所以无法实现并发。。。 大家有兴趣自己搞搞。
    https://github.com/MeYoung/WebUIAutomation_Selenium