• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
何日才能成为大神
博客园    首页    新随笔    联系   管理    订阅  订阅

V03

package common;

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.Set;
import java.util.regex.Pattern;

import org.apache.log4j.Logger;
import org.apache.poi.poifs.crypt.dsig.KeyInfoKeySelector;
import org.apache.tika.metadata.WordPerfect;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.interactions.SendKeysAction;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;

import pojo.Page;
import pojo.UIElement;
import utils.BrowserUtils;
import utils.RegexUtils;
import utils.XmlUtils;


public class BasePage {
    

    private final static Logger logger = Logger.getLogger(BasePage.class);

    /**
     *     获取浏览器
     * @return        浏览器
     */
    public static WebDriver getBroswer() {
        return BrowserUtils.getDriver();
    }
    
    /**
     *     获取JavascriptExecutor
     * @return        JavascriptExecutor
     */
    public static JavascriptExecutor getJs() {
        return BrowserUtils.getJavascriptExecutor();
    }
    
    /**
     *     获取WebDriverWait
     * @return        WebDriverWait
     */
    public static WebDriverWait getWait() {
        return BrowserUtils.getWebDriverWait();
    }
    
    /**
     *     创建本地浏览器或者远程浏览器
     * @param type                        type→本地/远程
     * @param browserType                浏览器类型
     */
    public static  void createBroswer(String type,String browserType) {
        logger.info("================================打开"+type+"浏览器("+browserType+") ========================================");
        if (type.contains("本地")) {
            BrowserUtils.openBrowser(browserType);;
        }else if (type.contains("远程")) {
            BrowserUtils.openRemoteBrowser(browserType);
        }
    }
    
    /**
     *     创建本地浏览器
     * @param browserType        浏览器类型
     */
    public static void createBrowser(String browserType) {
        logger.info("================================打开远程端浏览器("+browserType+") ========================================");
        BrowserUtils.openBrowser(browserType);
    }
    
    /**
     *     创建远程浏览器
     * @param browserType        浏览器类型
     */
    public static void createRemoteBrowser(String browserType) {
        logger.info("================================打开本地浏览器("+browserType+") ========================================");
        BrowserUtils.openRemoteBrowser(browserType);
    }
    
    /**
     *     清楚缓存
     */
    public static  void ClearCache () {
     logger.info("================================开始清除缓存 ========================================");
     Set<Cookie> coo = getBroswer().manage().getCookies();
     //打印Cookie
     logger.info("cookies信息:【"+coo.toString()+"】"); 
     //清除所有的缓存
     getBroswer().manage().deleteAllCookies();
     }
    
    /**
     *     跳转到指定的url
     * @param url        需跳转的url地址
     */
    public static void getUrl(String url) {
        logger.info("浏览器跳转到:【"+url+"】");
        getBroswer().get(url);

    }
    
    

    /**
     *     硬性等待
     * @param time        毫秒
     */
    public static void waitTime(int time) {
        try {
            logger.info("线程等待:【"+(double)time/1000+"】秒");
            Thread.sleep(time);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    /**
     *     最大化窗口
     */
    public static void maxWindow() {
        logger.info("window窗口最大化");
        getBroswer().manage().window().maximize();
    }
    
    
    /**
     *     根据获取的标题来切换句柄  获取的标题包含预期的标题才能切换  
     * @param title    标题
     */
    public void switchWindowByTitle(String title) {
        Set<String> handles = getBroswer().getWindowHandles();
        logger.info("获取【handles大小】为:【"+handles.size()+"】,【获取的handles】为:【"+handles.toString()+"】");
        for (String handle : handles) {
            if (getBroswer().getTitle().contains(title)) {
                logger.info("当前句柄的【标题】:【"+getBroswer().getTitle()+"】,符合预期的标题,切换成功");
                break;
            }else {
                logger.info("当前句柄的【标题】:【"+getBroswer().getTitle()+"】,切换句柄,寻找符合标题的句柄");
                getBroswer().switchTo().window(handle);
            }
        }
    }
    //====================================================================================================================
    //====================================================================================================================
    //====================================================================================================================
    //====================================================================================================================
    //====================================================================================================================
    //====================================================================================================================
    //====================================================================================================================
    //====================================================================================================================
    
    public static void main(String[] args) {
        name(args);
    }
    
    //====================================================================================================================
    //====================================================================================================================
    //====================================================================================================================
    //====================================================================================================================
    //====================================================================================================================
    //====================================================================================================================
    //====================================================================================================================
    //====================================================================================================================
    
    public static void name(String[] args) {
        createBrowser( "chrome");
        maxWindow();
        getBroswer().manage().deleteAllCookies();
        getBroswer().get("http://egis-cspi-padis-dmzstg1.pingan.com.cn/cspi-internet/palogin.jsp");
        input(By.cssSelector("#userName"), "01713801151301");
        input(By.cssSelector("#passwordInput"), "a8888888");
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        getBroswer().switchTo().defaultContent();
        try {
            getBroswer().switchTo().frame(getBroswer().findElement(By.cssSelector("#EM_PAGE")));    
        }catch(Exception e) {
            if (assertEleContains(By.cssSelector("#center"), "没有找到相应信息")) {
                getBroswer().navigate().refresh();
                waitTime(2000);
                if (assertEleContains(By.cssSelector("#warmTips"), "温馨提示")){    
                    getBroswer().switchTo().frame(getBroswer().findElement(By.cssSelector("#EM_PAGE")));    
                    getBroswer().switchTo().frame(getBroswer().findElement(By.cssSelector("#content")));
                }else {
                    getBroswer().switchTo().alert().accept();
                    waitTime(2000);
                    input(By.cssSelector("#passwordInput"), "a8888888");
                    try {
                        Thread.sleep(10000);
                    } catch (InterruptedException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                    getBroswer().switchTo().frame(getBroswer().findElement(By.cssSelector("#EM_PAGE")));    
                    getBroswer().switchTo().frame(getBroswer().findElement(By.cssSelector("#content")));
                }
                    
                
        }}
        /**
         * 点击提示关闭按钮
         */
        getBroswer().switchTo().defaultContent();
        getBroswer().switchTo().frame(getBroswer().findElement(By.cssSelector("#EM_PAGE")));    
        getBroswer().switchTo().frame(getBroswer().findElement(By.cssSelector("#content")));
        waitVisibilityOfElementLocated(By.cssSelector("#warmTips"));
        clickByJs(getBroswer().findElement(By.cssSelector("#warmTips #closeWarmTips")));
        /**
         * 通过键盘按钮点击回车键
         */
        try {
            Thread.sleep(6000);
            Robot robot = new Robot();
            robot.keyPress(KeyEvent.VK_ENTER);        
            robot.keyRelease(KeyEvent.VK_ENTER);          
            robot.delay(500);   
        } catch (Exception e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        /**
         * 点击alter弹框
         */
//        getBroswer().switchTo().alert().accept();
        /**
         * 点击提示关闭按钮
         */
        clickByJs(        waitVisibilityOfElementLocated(By.cssSelector("#warmTips #closeWarmTips")));
        getBroswer().switchTo().defaultContent();
        getBroswer().switchTo().frame(getBroswer().findElement(By.cssSelector("#EM_PAGE")));
        /**
         * 点击悬浮保全处理查询
         */
        new Actions(getBroswer()) .moveToElement(
                waitVisibilityOfElementLocated(By.xpath("//a[contains(text(),'保全处理查询')]"))).perform();
        /**
         * 点击余额管理
         */
        clickByJs(waitVisibilityOfElementLocated(By.xpath("//a[contains(text(),'余额管理')]")));
        getBroswer().switchTo().frame(getBroswer().findElement(By.cssSelector("#content")));
    
        /**
         * 保单号
         */
        String policyNo = "GP02002024242842";
        /**
         * 输入保单号
         */
        waitVisibilityOfElementLocated(By.cssSelector("#queryPolNoT")).sendKeys(policyNo);
        /**
         * 点击查询
         */
        waitElementToBeClickable(By.cssSelector("[onclick*='queryPolInfoByPolNo()']")).click();
        String beforeText = waitVisibilityOfElementLocated(By.xpath("//th[contains(text(),'保单号')]/parent::tr/following-sibling::tr")).getText();
        String beforeMOney = RegexUtils.regexSingleMatch("(?<=\\s)\\d+\\.\\d+(?=\\s)", beforeText);
        Double beforeMOney1 = Double.parseDouble(beforeMOney);
        System.out.println(beforeText+"  "+beforeMOney1);
//        String beforeText = waitVisibilityOfElementLocated(By.xpath("//th[contains(text(),'保单号')]/parent::tr/following-sibling::tr")).getText();
//        String beforeMOney = RegexUtils.regexSingleMatch("(?<=\\s)\\d+\\.\\d+(?=\\s)", beforeText);
//        Double beforeMOney1 = Double.parseDouble(beforeMOney);
//        System.out.println(beforeText+"  "+beforeMOney1);
    
        /**
         * 验证查询后数据是否正确  assertPolInfoLink
         *     是否包含查询的保单号
         */
        boolean assertContains = assertRowContains(By.xpath("//th[contains(text(),'保单号')]/parent::tr/following-sibling::tr"),policyNo);
        /**
         * 查询出来的保单号是否唯一
         */
        System.out.println("保单查询后是否包含:【"+assertContains+"】");
        boolean assertInfoCountOne = assertInfoCountOne(By.xpath("//th[contains(text(),'保单号')]/parent::tr/following-sibling::tr") );
        System.out.println("保单查询后是否唯一:【"+assertInfoCountOne+"】");

        /**
         * 点击保单链接
         */
        waitElementToBeClickable(By.cssSelector("a[onclick*=displayDetail]")).click();
        /**
         * 验证保单链接功能  
         *     包含    团体保单详情页
         *         保单信息
         *         投保人信息
         *         保障信息
         *         层级信息
         */
        boolean assertEleContains2 = assertEleContains(By.cssSelector("#dialogContent.process-content "), "block", "style");
        System.out.println("是否包含属性值:"+assertEleContains2);
        boolean assertEleContains = assertEleContains(By.cssSelector("#dialogContent.process-content "),"团体保单详情页" );
        System.out.println("元素文本值是否包含:"+assertEleContains);
        assertEleContains = assertEleContains(By.cssSelector("#dialogContent.process-content "),"保单信息" );
        System.out.println("元素文本值是否包含:"+assertEleContains);
        assertEleContains = assertEleContains(By.cssSelector("#dialogContent.process-content "),"投保人信息" );
        System.out.println("元素文本值是否包含:"+assertEleContains);
        assertEleContains = assertEleContains(By.cssSelector("#dialogContent.process-content "),"保障信息" );
        System.out.println("元素文本值是否包含:"+assertEleContains);
        assertEleContains = assertEleContains(By.cssSelector("#dialogContent.process-content "),"层级信息" );
        System.out.println("元素文本值是否包含:"+assertEleContains);
        /**
         * 滑动到层级信息
         */
        scrollIntoTopView(waitPresenceOfElementLocated(By.xpath("//*[contains(text(),'层级信息')]")));
        waitTime(5000);
        System.out.println(" 已经滑懂了");
//        scrollInTobottomView(waitPresenceOfElementLocated(By.xpath("//*[contains(text(),'层级信息')]")));
//        waitTime(5000);

        /**
         * 点击职业链接
         */
        waitElementToBeClickable(By.cssSelector("[onclick*='showProfCode']")).click();
        /**
         * 点击职业层级链接后显示的层级详情
         */
        assertEleContains2 = assertEleContains(By.xpath("//tr[@class='show-li' and not(contains(@style,'none'))]"), "", "style");
        System.out.println("是否包含属性值:"+assertEleContains2);
        assertEleContains2 = assertEleContains(By.xpath("//tr[@class='show-li' and not(contains(@style,'none'))]"), "职业描述");
        System.out.println("是否包含文本值:"+assertEleContains2);
        assertEleContains2 = assertEleContains(By.xpath("//tr[@class='show-li' and not(contains(@style,'none'))]"), "职业代码");
        System.out.println("是否包含文本值:"+assertEleContains2);
        assertEleContains2 = assertInfoCountBigOne(By.xpath("//tr[@class='show-li' and not(contains(@style,'none'))]//td[2][not(contains(text(),'职业'))]/parent::tr"));
        System.out.println("元素是否大于等于1个元素:"+assertEleContains2);
        /**
         * 点击层级明细链接
         * showDetailNew
         */
        waitElementToBeClickable(By.cssSelector("[onclick*='showDetailNew']")).click();
        assertEleContains2 = assertEleContains(By.xpath("//tr[@class='show-li' and not(contains(@style,'none'))]"), "", "style");
        System.out.println("是否包含属性值:"+assertEleContains2);
        assertEleContains2 = assertEleContains(By.xpath("//tr[@class='show-li' and not(contains(@style,'none'))]"), "保险金额");
        System.out.println("是否包含文本值:"+assertEleContains2);
        assertEleContains2 = assertEleContains(By.xpath("//tr[@class='show-li' and not(contains(@style,'none'))]"), "赔付比例");
        System.out.println("是否包含文本值:"+assertEleContains2);
        assertEleContains2 = assertInfoCountBigOne(By.xpath("//tr[@class='show-li' and not(contains(@style,'none'))]//td[2][not(contains(text(),'保险'))]/parent::tr"));
        System.out.println("元素是否大于等于1个元素:"+assertEleContains2);
        /**
         * 点击关闭保单详情按钮
         */
        clickByJs(waitElementToBeClickable(By.cssSelector("[onclick*='closetxt']")));
        /**
         * 点击转出按钮
         */
        clickByJs(waitElementToBeClickable(By.cssSelector("[onclick*='queryFundAmount']")));
        /**
         * 验证传出按钮是否跳余额转出页面
         */
        assertEleContains2 = assertEleContains(By.cssSelector("div#returnsDiv"), "单位对公账户");
        System.out.println("是否包含文本值:"+assertEleContains2);
        assertEleContains2 = assertEleContains(By.cssSelector("div#returnsDiv"), "余额转出明细");
        System.out.println("是否包含文本值:"+assertEleContains2);
        /**
         * 点击余额转出明细
         */
        click(By.cssSelector("[onclick*='historyRefundData']"));
        /**
         * 输入 余额转出明细 - 开始日期输入框
         */
        modifyValueByJs(waitVisibilityOfElementLocated(By.cssSelector("input#beginDate")), "2021-01-01");
        /**
         * 输入 余额转出明细 - 结束日期输入框
         */
        modifyValueByJs(waitVisibilityOfElementLocated(By.cssSelector("input#endDate")), "2021-03-13");
        /**
         * 选择 余额转出明细 - 转出状态
         */
        new Select(waitVisibilityOfElementLocated(By.cssSelector("select#applyStatus"))).selectByValue("P");
        /**
         * 点击余额转出明细 - 点击查询
         */
        clickByJs(waitVisibilityOfElementLocated(By.cssSelector("[onclick*='submitQuery']")));
//        click(By.cssSelector("[onclick*='submitQuery']"));
        /**
         * 断言查询后展示的数>=1
         */
        waitTime(2000);
        assertEleContains2 = assertInfoCountBigOne(By.cssSelector(".use_money_tr"));
        System.out.println("元素是否大于等于1个元素:"+assertEleContains2);
        /**
         * 判断余额转出明细详情页 是否包含  div#history_data_display
         *     流水号
         *  转移金额
         */
        assertEleContains2 = assertEleContains(By.cssSelector("div#history_data_display"), "流水号");
        System.out.println("是否包含文本值:"+assertEleContains2);
        assertEleContains2 = assertEleContains(By.cssSelector("div#history_data_display"), "转移金额");
        System.out.println("是否包含文本值:"+assertEleContains2);
        /**
         * 余额转出明细详情页 返回按钮[onclick*='goBack()']
         */
        click(By.cssSelector("[onclick*='goBack()']"));
        /**
         * 点击 单位对公账户链接
         */
        click(By.cssSelector("[onclick*='setBankAcounts']"));
        /**
         * 单位对公账户链接 后显示的用户须知
         */
        assertEleContains2 = assertEleContains(By.cssSelector("div#infoDiv"),"用户告知");
        System.out.println("是否包含文本值:"+assertEleContains2);
        assertEleContains2 = assertEleContains(By.cssSelector("div#infoDiv"),"注意事项");
        System.out.println("是否包含文本值:"+assertEleContains2);
        assertEleContains2 = assertEleContains(By.cssSelector("div#infoDiv"),"责任免除");
        /**
         * 单位对公账户链接  接受按钮 
         */
        click(By.cssSelector("[onclick*='goToNext']"));
        /**
         * 账户信息维护页-开户银行
         */
        waitVisibilityOfElementLocated(By.cssSelector("#bankName"));
//        input(By.cssSelector("input#bankName"), "a");
        
    
        try {
            
            Robot r = new Robot();
            waitTime(1000);
            r.keyPress(KeyEvent.VK_TAB);
            r.keyRelease(KeyEvent.VK_TAB);
            r.delay(200);
            waitTime(1000);
            r.keyPress(KeyEvent.VK_TAB);
            r.keyRelease(KeyEvent.VK_TAB);
            r.delay(200);
            waitTime(1000);
            r.keyPress(KeyEvent.VK_B);
            r.keyRelease(KeyEvent.VK_B);
            r.delay(200);
            waitTime(1000);
            waitTime(1000);
            r.keyPress(KeyEvent.VK_ENTER);
            r.keyRelease(KeyEvent.VK_ENTER);
            r.delay(200);
            waitTime(1000);
            r.keyPress(KeyEvent.VK_DOWN);
            r.keyRelease(KeyEvent.VK_DOWN);
            r.delay(200);
            waitTime(1000);
            r.keyPress(KeyEvent.VK_ENTER);
            r.keyRelease(KeyEvent.VK_ENTER);
            r.delay(200);
            waitTime(1000);

            /**
             * 输入账户信息维护-分行
             */
            waitTime(1000);
            r.keyPress(KeyEvent.VK_TAB);
            r.keyRelease(KeyEvent.VK_TAB);
            r.delay(200);
            waitTime(1000);waitTime(1000);
            r.keyPress(KeyEvent.VK_B);
            r.keyRelease(KeyEvent.VK_B);
            r.delay(200);
            waitTime(1000);
            r.keyPress(KeyEvent.VK_ENTER);
            r.keyRelease(KeyEvent.VK_ENTER);
            r.delay(200);
            waitTime(1000);
            waitTime(1000);    
            r.keyPress(KeyEvent.VK_DOWN);
            r.keyRelease(KeyEvent.VK_DOWN);
            r.delay(200);
            waitTime(1000);
            r.keyPress(KeyEvent.VK_ENTER);
            r.keyRelease(KeyEvent.VK_ENTER);
            r.delay(200);
            waitTime(1000);

            /**
             * 账户信息维护-支行
             * 输入支行
             */
            input(By.cssSelector("#subbranchBank"), "自动化支行"+new Random().nextInt(1000));
            /**
             * 账户信息维护-银行账户
             * bankAccount
             */
            input(By.cssSelector("#bankAccount"), "6217855300003734772");
            /**
             * 点击账户信息维护-确认按钮 doSaveButton
             */
            click(By.cssSelector("#doSaveButton"));
            /**
             * 点击账户信息维护-弹框确定按钮
             */
            boolean assertAlterContains = assertAlterContains("银行账号信息保存成功");
            System.out.println("assertAlterContains:"+assertAlterContains);
            waitTime(1000);
            r.keyPress(KeyEvent.VK_ENTER);
            r.keyRelease(KeyEvent.VK_ENTER);
            r.delay(200);
            waitTime(1000);
        } catch (Exception e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }

        /**
         * 点击转出按钮
         */
        clickByJs(waitElementToBeClickable(By.cssSelector("[onclick*='queryFundAmount']")));
        /**
         * 点击 单位对公账户链接
         */
        click(By.cssSelector("[onclick*='setBankAcounts']"));/**
         * 单位对公账户链接  接受按钮 
         */
        click(By.cssSelector("[onclick*='goToNext']"));
        /**
         * 历史维护账户信息 历史维护账户信息按钮
         */
        click(By.cssSelector("[onclick*='queryHistoryBank']"));
        /**
         * 历史维护账号信息-历史信息勾选框
         * 判断是否包含页面带出历史账户信息提示
         */
        boolean assertEleContains3 = assertEleContains(By.cssSelector("#bankDiv2"),"页面带出历史账户信息");
        System.out.println(assertEleContains3);
        /**
         * 判断历史账户信息行唯一
         */
        boolean assertInfoCountOne2 = assertInfoCountOne(By.cssSelector("#bankDiv2 [id*='items']"));
        System.out.println("assertInfoCountOne2:"+assertInfoCountOne2);
        String text = waitVisibilityOfElementLocated(By.cssSelector("#bankno1")).getText();
        System.out.println(text);
        /**
         * 点击历史维护账号信息-历史账户勾选框
         */
        click(By.cssSelector("#check1"));
        waitTime(2000);
        /**
         * 断言历史维护账号信息-跳转到 历史维护账号信息
         */
        boolean assertEleContains4 = assertEleContains(By.cssSelector("#bankDiv"),"账户信息维护");
        System.out.println(assertEleContains4);
        /**
         * 账户信息维护-确认按钮
         * 
         */
        click(By.cssSelector("#doSaveButton"));
        /**
         * 点击账户信息维护-弹框确定按钮
         */
        boolean assertAlterContains = assertAlterContains("银行账号信息保存成功");
        System.out.println("assertAlterContains:"+assertAlterContains);
        waitTime(1000);
        Robot r;
        try {
            r = new Robot();
            r.keyPress(KeyEvent.VK_ENTER);
            r.keyRelease(KeyEvent.VK_ENTER);
            r.delay(200);
            waitTime(1000);
        } catch (Exception e3) {
            // TODO Auto-generated catch block
            e3.printStackTrace();
        }
        /**
         * 点击转出按钮
         */
        clickByJs(waitElementToBeClickable(By.cssSelector("[onclick*='queryFundAmount']")));
        /**
         * 余额转出-可用转出金额输入框
         */
        String refundMoney = "1";
        modifyValueByJs(waitVisibilityOfElementLocated(By.cssSelector("input#amount")), refundMoney);
        /**
         * [onclick*='callRefundSubmit']
         *     余额转出-确定转出按钮
         */
        click(By.cssSelector("[onclick*='callRefundSubmit']"));
        /**
         * 判断余额转出-确定转出后-处理完成提示框是否包含转出的价格
         * 
         */
        boolean assertEleContains5 = assertEleContains(By.cssSelector("div#suPag"),"余额"+refundMoney+"元");
        System.out.println("assertEleContains5:"+assertEleContains5);
        /**
         * 余额转出-确定转出后-处理完成提示框-确定按钮
         */
        click(By.cssSelector("[onclick*='gotoView']"));
        /**
         * 余额管理-转入按钮
         */
        click(By.cssSelector("[onclick*='findUseableBalacePol']"));
        /**
         *  余额管理-余额转入
         *  detail_useable_div
         *  判断 余额转入是否包含 余额转入详情页
         */
        assertEleContains(By.cssSelector("div#detail_useable_div"),"余额转入");
        assertEleContains(By.cssSelector("div#detail_useable_div"),policyNo);
        assertEleContains(By.cssSelector("div#detail_useable_div"),"转移余额");
        assertEleContains(By.cssSelector("div#detail_useable_div"),"可用余额");
        /**
         * 余额管理-余额转入-余额互转明细链接
         */
        click(By.cssSelector("[onclick*='historyData']"));
        //====================================================
        /**
         * 输入 余额互转明细 - 开始日期输入框
         */
        modifyValueByJs(waitVisibilityOfElementLocated(By.cssSelector("input#applyBeginDate")), "2021-01-01");
        /**
         * 输入 余额互转明细 - 结束日期输入框
         */
        modifyValueByJs(waitVisibilityOfElementLocated(By.cssSelector("input#applyEndDate")), "2021-03-13");
        /**
         * 选择 余额互转明细 - 支付模式
         */
        new Select(waitVisibilityOfElementLocated(By.cssSelector("select#payMode"))).selectByValue("1");
        /**
         * 点击余额互转明细  - 点击查询
         */
        clickByJs(waitVisibilityOfElementLocated(By.cssSelector("[onclick*='histMovePage']")));
//        click(By.cssSelector("[onclick*='submitQuery']"));
        /**
         * 断言查询后展示的数>=1
         */
        waitTime(2000);
        assertEleContains2 = assertInfoCountBigOne(By.cssSelector(".use_money_tr"));
        System.out.println("元素是否大于等于1个元素:"+assertEleContains2);
        /**
         * 判断余额转出明细详情页 是否包含  div#history_data_display
         *     流水号
         *  转移金额
         */
        assertEleContains2 = assertEleContains(By.cssSelector("div#history_data_display"), "流水号");
        System.out.println("是否包含文本值:"+assertEleContains2);
        assertEleContains2 = assertEleContains(By.cssSelector("div#history_data_display"), "转移金额");
        System.out.println("是否包含文本值:"+assertEleContains2);
        /**
         * 余额管理查询页 -  查询结果行        boolean assertContains = assertRowContains(By.cssSelector("#user_pol_div_id .img-position tr"),policyNo);
         */
        String text2 = waitVisibilityOfElementLocated(By.xpath("//th[contains(text(),'保单号')]/parent::tr/following-sibling::tr")).getText();
        String regexSingleMatch = RegexUtils.regexSingleMatch("(?<=\\s)\\d+\\.\\d+(?=\\s)", text2);
        Double d = Double.parseDouble(regexSingleMatch);
        System.out.println(text2+"    "+d);
        if (beforeMOney1==(d+Double.parseDouble(refundMoney))) {
            System.out.println("true");
        }else {
            System.out.println("false");

        }
        /**
         * 点击余额互转明细 - 返回 ackWay();
         */
        clickByJs(waitVisibilityOfElementLocated(By.cssSelector("[onclick*='backWay']")));
        /**
         * 暂时没有转入订单 余额转入-确定转入按钮
         */
        clickByJs(waitVisibilityOfElementLocated(By.cssSelector("[onclick*='submitConvertMoney']")));

    }

//     policyNo = "GP02002024242842";
    /**
     * 测试保单连接
     * @param policyNo
     */
    public void checkPolicyLink(String policyNo) {
        yuEGuanLiBaseFun(policyNo);
        waitElementToBeClickable(By.cssSelector("a[onclick*=displayDetail]")).click();        
    }
    
    /**
     * 测试职业链接
     * @param policyNo
     */
    public void checkShowProfCode(String policyNo) {
        checkPolicyLink(policyNo);
        /**
         * 滑动到层级信息
         */
        scrollIntoTopView(waitPresenceOfElementLocated(By.xpath("//*[contains(text(),'层级信息')]")));
        /**
         * 点击职业链接
         */
        waitElementToBeClickable(By.cssSelector("[onclick*='showProfCode']")).click();
    }
    
    /**
     * 测试层级明细链接
     * @param policyNo
     */
    public void checkshowDetailNew(String policyNo) {
        checkPolicyLink(policyNo);
        /**
         * 滑动到层级信息
         */
        scrollIntoTopView(waitPresenceOfElementLocated(By.xpath("//*[contains(text(),'层级信息')]")));
        /**
         * 点击层级明细链接
         * 
         */
        waitElementToBeClickable(By.cssSelector("[onclick*='showDetailNew']")).click();
    }
    
    /**
     * 测试 转出功能
     *     String refundMoney = "1";
     * @param policyNo
     */
    public void checkQueryFundAmount(String policyNo,String refundMoney) {
        yuEGuanLiBaseFun(policyNo);
        /**
         * 点击转出
         */
        clickByJs(waitElementToBeClickable(By.cssSelector("[onclick*='queryFundAmount']")));
        /**
         * 余额转出-可用转出金额输入框
         */
    
        modifyValueByJs(waitVisibilityOfElementLocated(By.cssSelector("input#amount")), refundMoney);
        /**
         * [onclick*='callRefundSubmit']
         *     余额转出-确定转出按钮
         */
        click(By.cssSelector("[onclick*='callRefundSubmit']"));
        /**
         * 判断余额转出-确定转出后-处理完成提示框是否包含转出的价格
         * 
         */
        boolean assertEleContains5 = assertEleContains(By.cssSelector("div#suPag"),"余额"+refundMoney+"元");
        System.out.println("assertEleContains5:"+assertEleContains5);
        /**
         * 余额转出-确定转出后-处理完成提示框-确定按钮
         */
        click(By.cssSelector("[onclick*='gotoView']"));
    }
    
    /**
     * 点击余额管理 输入保单号查询
     * @param policyNo
     * @return            返回未转入转出的金额        double 类型
     */
    public static Double yuEGuanLiBaseFun(String policyNo ) {
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        getBroswer().switchTo().defaultContent();
        try {
            getBroswer().switchTo().frame(getBroswer().findElement(By.cssSelector("#EM_PAGE")));    
        }catch(Exception e) {
            if (assertEleContains(By.cssSelector("#center"), "没有找到相应信息")) {
                getBroswer().navigate().refresh();
                waitTime(2000);
                if (assertEleContains(By.cssSelector("#warmTips"), "温馨提示")){    
                    getBroswer().switchTo().frame(getBroswer().findElement(By.cssSelector("#EM_PAGE")));    
                    getBroswer().switchTo().frame(getBroswer().findElement(By.cssSelector("#content")));
                }else {
                    getBroswer().switchTo().alert().accept();
                    waitTime(2000);
                    input(By.cssSelector("#passwordInput"), "a8888888");
                    try {
                        Thread.sleep(10000);
                    } catch (InterruptedException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                    getBroswer().switchTo().frame(getBroswer().findElement(By.cssSelector("#EM_PAGE")));    
                    getBroswer().switchTo().frame(getBroswer().findElement(By.cssSelector("#content")));
                }
                    
                
        }}
        /**
         * 点击提示关闭按钮
         */
        getBroswer().switchTo().defaultContent();
        getBroswer().switchTo().frame(getBroswer().findElement(By.cssSelector("#EM_PAGE")));    
        getBroswer().switchTo().frame(getBroswer().findElement(By.cssSelector("#content")));
        waitVisibilityOfElementLocated(By.cssSelector("#warmTips"));
        clickByJs(getBroswer().findElement(By.cssSelector("#warmTips #closeWarmTips")));
        /**
         * 通过键盘按钮点击回车键
         */
        try {
            Thread.sleep(6000);
            Robot robot = new Robot();
            robot.keyPress(KeyEvent.VK_ENTER);        
            robot.keyRelease(KeyEvent.VK_ENTER);          
            robot.delay(500);   
        } catch (Exception e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        /**
         * 点击alter弹框
         */
//        getBroswer().switchTo().alert().accept();
        /**
         * 点击提示关闭按钮
         */
        clickByJs(        waitVisibilityOfElementLocated(By.cssSelector("#warmTips #closeWarmTips")));
        getBroswer().switchTo().defaultContent();
        getBroswer().switchTo().frame(getBroswer().findElement(By.cssSelector("#EM_PAGE")));
        /**
         * 点击悬浮保全处理查询
         */
        new Actions(getBroswer()) .moveToElement(
                waitVisibilityOfElementLocated(By.xpath("//a[contains(text(),'保全处理查询')]"))).perform();
        /**
         * 点击余额管理
         */
        clickByJs(waitVisibilityOfElementLocated(By.xpath("//a[contains(text(),'余额管理')]")));
        getBroswer().switchTo().frame(getBroswer().findElement(By.cssSelector("#content")));
    
        /**
         * 保单号
         */
//        String policyNo = "GP02002024242842";
        /**
         * 输入保单号
         */
        waitVisibilityOfElementLocated(By.cssSelector("#queryPolNoT")).sendKeys(policyNo);
        /**
         * 点击查询
         */
        waitElementToBeClickable(By.cssSelector("[onclick*='queryPolInfoByPolNo()']")).click();
        String beforeText = waitVisibilityOfElementLocated(By.xpath("//th[contains(text(),'保单号')]/parent::tr/following-sibling::tr")).getText();
        String beforeMOney = RegexUtils.regexSingleMatch("(?<=\\s)\\d+\\.\\d+(?=\\s)", beforeText);
        Double beforeMOney1 = Double.parseDouble(beforeMOney);
        System.out.println(beforeText+"  "+beforeMOney1);
        return beforeMOney1;
    }

    
    
    //====================================================================================================================
    //====================================================================================================================
    //====================================================================================================================
    //====================================================================================================================
    //====================================================================================================================
    //====================================================================================================================
    //====================================================================================================================
    //====================================================================================================================

    public void yuEGuanLiBase() {
        
    }
    
    //====================================================================================================================
    //====================================================================================================================
    //====================================================================================================================
    //====================================================================================================================
    //====================================================================================================================
    //====================================================================================================================
    //====================================================================================================================
    //====================================================================================================================

    
    
    /**
     * 判断弹框文本是否包含关键字
     * @param key
     * @return    包含返回true,否则false
     */
    private static boolean assertAlterContains(String key) {
        try {
            waitTime(3000);
            System.out.println(getBroswer().switchTo().alert().getText());
            return getBroswer().switchTo().alert().getText().contains(key);            
        } catch (Exception e) {
            return false;
        }
        
    }
    
    

    /**
     * 判断元素的属性值是否包含预期的属性值
     * @param by
     * @param value
     * @param name
     * @return 包含返回true,不包含返回false
     */
    public static boolean assertEleContains(By by,String value,String name) {
        try {
            return waitVisibilityOfElementLocated(by).getAttribute(name).contains(value);
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 判断元素的文本是否包含关键字
     * @param by
     * @param key
     * @return    包含返回true,不包含返回false
     */
    public static boolean assertEleContains(By by,String key) {
        try {
            return waitVisibilityOfElementLocated(by).getText().contains(key);
        } catch (Exception e) {
            return false;
        }
    }


    
    /**
     * 判断所有元素获取的文本是否包含指定关键字
     * @param by
     * @param key
     * @return        包含返回true,不包含false
     */
    private static boolean assertRowContains(By by,String key) {
        try {
            List<WebElement> list = waitVisibilityOfAllElementsLocatedBy(by);
            for (WebElement webElement : list) {
                if (webElement.getText().contains(key)) {
                    return true;
                }
            }
            return false;            
        } catch (Exception e) {
            return false;
        }
    }
    /**
     * 判断所有元素个数是否一个
     * @param by
     * @param key
     * @return        是一个true,不是唯一返回false
     */
    private static boolean assertInfoCountOne(By by) {
        try {
            List<WebElement> list = waitVisibilityOfAllElementsLocatedBy(by);
            if (list.size()==1) {
                return true;
            }
            return false;
        } catch (Exception e) {
            return false;
        }
    }
    
    /**
     * 判断所有元素个数是否大于等于一个
     * @param by
     * @param key
     * @return        是一个true,不是唯一返回false
     */
    private static boolean assertInfoCountBigOne(By by) {
        try {
            List<WebElement> list = waitVisibilityOfAllElementsLocatedBy(by);
            if (list.size()>=1) {
                return true;
            }
            return false;
        } catch (Exception e) {
            return false;
        }
    }
    
    
    
    /**
     *     根据获取的url来切换句柄  获取的标题包含预期的标题才能切换  
     * @param url    标题
     */
    public void switchWindowByCurrentUrl(String url) {
        Set<String> handles = getBroswer().getWindowHandles();
        logger.info("获取【handles大小】为:【"+handles.size()+"】,【获取的handles】为:【"+handles.toString()+"】");
        for (String handle : handles) {
            if (getBroswer().getCurrentUrl().contains(url)) {
                logger.info("当前句柄的【url】:【"+getBroswer().getCurrentUrl()+"】,符合预期的标题,切换成功");
                break;
            }else {
                logger.info("当前句柄的【url】:【"+getBroswer().getCurrentUrl()+"】,切换句柄,寻找符合标题的句柄");
                getBroswer().switchTo().window(handle);
            }
        }
    }
    
    /**
     *     等待单个元素存在在dom对象中,但不一定可见
     * @param locator        By 对象定位信息
     * @return        返回存在dom 单个WebElement中元素,否则抛出异常
     */
    public static WebElement waitPresenceOfElementLocated(By locator) {
        logger.info("获取【locator定位信息】为:【"+locator.toString()+"】,等待元素在dom中存在");
        logger.info("返回的元素有【"+ getWait().until(ExpectedConditions.presenceOfElementLocated(locator)).toString()+"】");
        return getWait().until(ExpectedConditions.presenceOfElementLocated(locator));
    }
    
    /**
     *     等待单个元素存在在dom对象中,但不一定可见
     * @param expectedPageKeyword                    预期页面关键在
     * @param expectedUIElementKeyword                预期元素关键字
     * @return        返回存在dom 单个WebElement中元素,否则抛出异常
     */
    public static WebElement waitPresenceOfElementLocated(String expectedPageKeyword,String expectedUIElementKeyword) {
        logger.info("获取【页面关键字】为:【"+expectedPageKeyword+"】,获取【元素关键字】为:【"+expectedUIElementKeyword+"】,等待元素在dom中存在");
        By by = getXmlBy(expectedPageKeyword, expectedUIElementKeyword);
        logger.info("获取【元素定位信息】为:【"+by.toString()+"】");
        logger.info("返回的元素有【"+ getWait().until(ExpectedConditions.presenceOfElementLocated(by)).toString()+"");
        return getWait().until(ExpectedConditions.presenceOfElementLocated(by));
    }
    
    /**
     *     等待多个个元素存在在dom对象中,但不一定可见
     * @param expectedPageKeyword                    预期页面关键在
     * @param expectedUIElementKeyword                预期元素关键字
     * @return 返回存在dom 多个WebElement中元素-List<WebElement>,否则抛出异常
     */
    public static List<WebElement> waitPresenceOfAllElementsLocatedBy(String expectedPageKeyword,String expectedUIElementKeyword) {
        logger.info("获取【页面关键字】为:【"+expectedPageKeyword+"】,获取【元素关键字】为:【"+expectedUIElementKeyword+"】,等待元素们在dom中存在");
        By by = getXmlBy(expectedPageKeyword, expectedUIElementKeyword);
        logger.info("获取【元素定位信息】为:【"+by.toString()+"】");
        logger.info("返回的元素有【"+ getWait().until(ExpectedConditions.presenceOfAllElementsLocatedBy(by)).toString()+"】,其个数为【"+getWait().until(ExpectedConditions.presenceOfAllElementsLocatedBy(by)).size()+"】");
        return getWait().until(ExpectedConditions.presenceOfAllElementsLocatedBy(by));
    }
    
    /**
     *      等待多个个元素存在在dom对象中,但不一定可见
     * @param locator        By 对象定位信息
     * @return 返回存在dom 多个WebElement中元素-List<WebElement>,否则抛出异常
     */
    public static List<WebElement> waitPresenceOfAllElementsLocatedBy(By locator) {
        logger.info("获取【locator定位信息】为:【"+locator.toString()+"】,等待元素们在dom中存在");
        logger.info("返回的元素有【"+ getWait().until(ExpectedConditions.presenceOfAllElementsLocatedBy(locator)).toString()+"】,其个数为【"+getWait().until(ExpectedConditions.presenceOfAllElementsLocatedBy(locator)).size()+"】");
        return getWait().until(ExpectedConditions.presenceOfAllElementsLocatedBy(locator));
    }
    
    
    //===================
    /**
     *     等待单个元素在页面可见
     * @param locator        By 对象定位信息
     * @return        返回页面可见的 单个WebElement中元素,否则抛出异常
     */
    public static WebElement waitVisibilityOfElementLocated(By locator) {
        logger.info("获取【locator定位信息】为:【"+locator.toString()+"】,等待元素在页面可见");
        logger.info("返回的元素有【"+ getWait().until(ExpectedConditions.visibilityOfElementLocated(locator)).toString()+"】");
        return getWait().until(ExpectedConditions.visibilityOfElementLocated(locator));
    }
    
    /**
     *     等待单个元素在页面可见
     * @param expectedPageKeyword                    预期页面关键在
     * @param expectedUIElementKeyword                预期元素关键字
     * @return        返回页面可见的 单个WebElement中元素,否则抛出异常
     */
    public static WebElement waitVisibilityOfElementLocated(String expectedPageKeyword,String expectedUIElementKeyword) {
        logger.info("获取【页面关键字】为:【"+expectedPageKeyword+"】,获取【元素关键字】为:【"+expectedUIElementKeyword+"】,等待元素在在页面可见");
        By by = getXmlBy(expectedPageKeyword, expectedUIElementKeyword);
        logger.info("获取【元素定位信息】为:【"+by.toString()+"】");
        logger.info("返回的元素有【"+ getWait().until(ExpectedConditions.visibilityOfElementLocated(by)).toString()+"");
        return getWait().until(ExpectedConditions.visibilityOfElementLocated(by));
    }
    
    /**
     *     等待单个元素在页面可见
     * @param element        需要等待的元素
     * @return        返回页面可见的 单个WebElement中元素,否则抛出异常
     */
    public static WebElement waitVisibilityOfElementLocated(WebElement element) {
        logger.info("获取【元素】为:【"+element.toString()+"】,等待页面可见");
        return getWait().until(ExpectedConditions.visibilityOf(element));
    }
    
    /**
     *     等待多个个元素在页面可见
     * @param expectedPageKeyword                    预期页面关键在
     * @param expectedUIElementKeyword                预期元素关键字
     * @return 返回存在页面 多个WebElement中元素-List<WebElement>,否则抛出异常
     */
    public static List<WebElement> waitVisibilityOfAllElementsLocatedBy(String expectedPageKeyword,String expectedUIElementKeyword) {
        logger.info("获取【页面关键字】为:【"+expectedPageKeyword+"】,获取【元素关键字】为:【"+expectedUIElementKeyword+"】,等待元们素在页面可见");
        By by = getXmlBy(expectedPageKeyword, expectedUIElementKeyword);
        logger.info("获取【元素定位信息】为:【"+by.toString()+"】");
        logger.info("返回的元素有【"+ getWait().until(ExpectedConditions.visibilityOfAllElementsLocatedBy(by)).toString()+"】,其个数为【"+getWait().until(ExpectedConditions.visibilityOfAllElementsLocatedBy(by)).size()+"】");
        return getWait().until(ExpectedConditions.visibilityOfAllElementsLocatedBy(by));
    }
    
    /**
     *     等待多个个元素在页面可见
     * @param locator        By 对象定位信息
     * @return 返回存在页面 多个WebElement中元素-List<WebElement>,否则抛出异常
     */
    public static List<WebElement> waitVisibilityOfAllElementsLocatedBy(By locator) {
        logger.info("获取【locator定位信息】为:【"+locator.toString()+"】,等待元素们在页面可见");
        logger.info("返回的元素有【"+ getWait().until(ExpectedConditions.visibilityOfAllElementsLocatedBy(locator)).toString()+"】,其个数为【"+getWait().until(ExpectedConditions.visibilityOfAllElementsLocatedBy(locator)).size()+"】");
        return getWait().until(ExpectedConditions.visibilityOfAllElementsLocatedBy(locator));
    }
    
    /**
     *     等待多个个元素在页面可见
     * @param locator        By 对象定位信息
     * @return 返回存在页面 多个WebElement中元素-List<WebElement>,否则抛出异常
     */
    public static List<WebElement> waitVisibilityOfAllElementsLocatedBy(WebElement ... elements) {
        logger.info("获取【locator定位信息】为:【"+elements.toString()+"】,等待元素们在页面可见");
        logger.info("返回的元素有【"+ getWait().until(ExpectedConditions.visibilityOfAllElements(elements)).toString()+"】,其个数为【"+getWait().until(ExpectedConditions.visibilityOfAllElements(elements)).size()+"】");
        return getWait().until(ExpectedConditions.visibilityOfAllElements(elements));
    }
    
    /**
     *     等待单个元素可被点击
     * @param locator        By 对象定位信息
     * @return        返回页面可点击单个WebElement中元素,否则抛出异常
     */
    public static WebElement waitElementToBeClickable(By locator) {
        logger.info("获取【locator定位信息】为:【"+locator.toString()+"】,等待元素可被点击");
        logger.info("返回的元素有【"+ getWait().until(ExpectedConditions.elementToBeClickable(locator)).toString()+"】");
        return getWait().until(ExpectedConditions.elementToBeClickable(locator));
    }
    
    
    /**
     *     等待单个元素可被点击
     * @param expectedPageKeyword                    预期页面关键在
     * @param expectedUIElementKeyword                预期元素关键字
     * @return        返回页面可点击单个WebElement中元素,否则抛出异常
     */
    public static WebElement waitElementToBeClickable(String expectedPageKeyword,String expectedUIElementKeyword) {
        logger.info("获取【页面关键字】为:【"+expectedPageKeyword+"】,获取【元素关键字】为:【"+expectedUIElementKeyword+"】,等待元素可被点击");
        By by = getXmlBy(expectedPageKeyword, expectedUIElementKeyword);
        logger.info("获取【元素定位信息】为:【"+by.toString()+"】");
        logger.info("返回的元素有【"+ getWait().until(ExpectedConditions.elementToBeClickable(by)).toString()+"");
        return getWait().until(ExpectedConditions.elementToBeClickable(by));
    }
    
    /**
     *     等待单个元素可被点击
     * @param element        需要等待的元素
     * @return        返回页面可点击单个WebElement中元素,否则抛出异常
     */
    public static WebElement waitElementToBeClickable(WebElement element) {
        logger.info("获取【元素】为:【"+element.toString()+"】,等待元素可被点击");
        return getWait().until(ExpectedConditions.elementToBeClickable(element));
    }
    
    
    /**
     *     等待Frame可以跳转并跳转进去
     * @param expectedPageKeyword                    预期页面关键在
     * @param expectedUIElementKeyword                预期元素关键字
     * @return        返回webDriver实例
     */
    public static WebDriver waitFrameToBeAvailableAndSwitchToIt(String expectedPageKeyword,String expectedUIElementKeyword) {
        logger.info("获取【页面关键字】为:【"+expectedPageKeyword+"】,获取【元素关键字】为:【"+expectedUIElementKeyword+"】,等待Frame可以跳转并跳转进去");
        By by = getXmlBy(expectedPageKeyword, expectedUIElementKeyword);
        logger.info("获取【元素定位信息】为:【"+by.toString()+"】");
        logger.info("返回的元素有【"+ getWait().until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(by)).toString()+"");
        return getWait().until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(by));
    }
    
    /**
     *     等待Frame可以跳转并跳转进去
     * @param element        需要等待的元素
     * @return        返回webDriver实例
     */
    public static WebDriver waitFrameToBeAvailableAndSwitchToIt(WebElement element) {
        logger.info("获取【元素】为:【"+element.toString()+"】,等待Frame可以跳转并跳转进去");
        return getWait().until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(element));
    }
    
    /**
     * 等待Frame可以跳转并跳转进去
     * @param frameLocator    (id or name)
     * @return        返回webDriver实例
     */
    public static WebDriver waitFrameToBeAvailableAndSwitchToIt(String frameLocator) {
        logger.info("获取【frame (id or name)】为:【"+frameLocator+"】,等待Frame可以跳转并跳转进去");
        return getWait().until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frameLocator));
    }
    
    /**
     * 等待Frame可以跳转并跳转进去
     * @param frameLocator    index
     * @return        返回webDriver实例
     */
    public static WebDriver waitFrameToBeAvailableAndSwitchToIt(int frameLocator) {
        logger.info("获取【frame (index)】为:【"+frameLocator+"】,等待Frame可以跳转并跳转进去");
        return getWait().until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frameLocator));
    }
    
    /**
     *     等待Frame可以跳转并跳转进去
     * @param locator        By 对象定位信息
     * @return        返回webDriver实例
     */
    public static WebDriver waitFrameToBeAvailableAndSwitchToIt(By locator) {
        logger.info("获取【locator定位信息】为:【"+locator.toString()+"】,等待Frame可以跳转并跳转进去");
        logger.info("返回的元素有【"+ getWait().until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(locator)).toString()+"】");
        return getWait().until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(locator));
    }
    
    
    /**
     * 点击某个元素
     * @param locator        By定位对象
     */
    public static void click(By locator ) {
        try {
            logger.info("点击了等待可以点击的元素,其定位信息【"+locator.toString()+"】");
            waitElementToBeClickable(locator).click();
        } catch (Exception e) {
            try {
                logger.info("点击了等待可以点击的元素失败,通过js点击,其定位信息【"+locator.toString()+"】");
                clickByJs(waitPresenceOfElementLocated(locator));
            } catch (Exception e2) {
                e.printStackTrace();
            }
        }
    }

    
    
    /**
     * 点击某个元素
     * @param element    元素对象        
     */
    public static void click(WebElement element ) {
        try {
            logger.info("点击了等待可以点击的元素,其元素信息【"+element.toString()+"】");
            waitElementToBeClickable(element).click();
        } catch (Exception e) {
            try {
                logger.info("点击了等待可以点击的元素失败,通过js点击,其元素信息【"+element.toString()+"】");
                clickByJs(element);
            } catch (Exception e2) {
                e.printStackTrace();
            }
        }
    }
    
    /**
     * 点击某个元素
     * @param expectedPageKeyword            预期页面
     * @param expectedUIElementKeyword        预期关键字
     */
    public static void click(String  expectedPageKeyword,String expectedUIElementKeyword ) {
        try {
            logger.info("点击了【关键页面】:【"+expectedPageKeyword+"】【关键元素】:【"+expectedUIElementKeyword+"】");
            waitElementToBeClickable(expectedPageKeyword, expectedUIElementKeyword).click();
        } catch (Exception e) {
            try {
                logger.info("点击了【关键页面】:【"+expectedPageKeyword+"】【关键元素】:【"+expectedUIElementKeyword+"】失败,现通过js点击");
                clickByJs(waitPresenceOfElementLocated(expectedPageKeyword, expectedUIElementKeyword));
            } catch (Exception e2) {
                e.printStackTrace();
            }
        }
    }
    
    /**
     * 输入信息
     * @param locator        By定位对象
     * @param keysToSend    输入的值
     */
    public static void input(By locator,String  keysToSend) {
        try {
            logger.info("对dom存在的元素进行输入,其定位信息【"+locator.toString()+"】,【输入的内容】为:【"+keysToSend+"】");
            waitPresenceOfElementLocated(locator).sendKeys(keysToSend);
            if (!checkTextToBePresentInElementValue(locator, keysToSend)) {
                logger.info("对dom存在的元素进行输入,输入的信息和value值不一致,通过js直接改变value值,其定位信息【"+locator.toString()+"】,【输入的内容】为:【"+keysToSend+"】");
                modifyValueByJs(waitVisibilityOfElementLocated(locator), keysToSend);
            }
        } catch (Exception e) {
                e.printStackTrace();
        }
    }

    

    /**
     * 输入信息
     * @param element            元素对象        
     * @param keysToSend        输入的值
     */
    public static void input(WebElement element,String  keysToSend ) {
        try {
            logger.info("对dom存在的元素进行输入,其定位信息【"+element.toString()+"】,【输入的内容】为:【"+keysToSend+"】");
            element.sendKeys(keysToSend);
            if (!checkTextToBePresentInElementValue(element, keysToSend)) {
                logger.info("对dom存在的元素进行输入,输入的信息和value值不一致,通过js直接改变value值,其定位信息【"+element.toString()+"】,【输入的内容】为:【"+keysToSend+"】");
                modifyValueByJs(element, keysToSend);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 点击某个元素
     * @param expectedPageKeyword            预期页面
     * @param expectedUIElementKeyword        预期关键字
     * @param keysToSend        输入的值
     */
    public static void input(String  expectedPageKeyword,String expectedUIElementKeyword,String  keysToSend  ) {
        try {
            logger.info("向【关键页面】:【"+expectedPageKeyword+"】【关键元素】:【"+expectedUIElementKeyword+"】输入【 "+keysToSend+"】");
            waitPresenceOfElementLocated(expectedPageKeyword, expectedUIElementKeyword).sendKeys(keysToSend);
            if (!checkTextToBePresentInElementValue(waitPresenceOfElementLocated(expectedPageKeyword, expectedUIElementKeyword), keysToSend)) {
                logger.info("对dom存在的元素进行输入,输入的信息和value值不一致,通过js直接改变value值,其关键页面【"+expectedPageKeyword+"】,【关键元素】:【"+ expectedUIElementKeyword+"】,【输入的内容】为:【"+keysToSend+"】");
                modifyValueByJs(waitPresenceOfElementLocated(expectedPageKeyword, expectedUIElementKeyword), keysToSend);
                }
        }catch (Exception e) {
                e.printStackTrace();
            }
    }
    
    
    /**
     * 取消选择所有select
     * @param locator        By 对象定位信息
     */
    public static void deselectAll(By locator) {
        logger.info("取消所有的select选项,select定位是:【"+locator.toString()+"】");
        Select select = new Select(waitPresenceOfElementLocated(locator));
        select.deselectAll();
    }

    /**
     * 取消选择所有select
     * @param element        WebElement对象
     */
    public static void deselectAll(WebElement element) {
        logger.info("取消所有的select选项,select定位是:【"+element.toString()+"】");
        Select select = new Select(element);
        select.deselectAll();
    }
    
    /**
     * 取消选择所有select
     * @param expectedPageKeyword            预期页面
     * @param expectedUIElementKeyword        预期关键字     
     */
    public static void deselectAll(String  expectedPageKeyword,String expectedUIElementKeyword) {
        logger.info("取消所有的select选项");
        Select select = new Select(waitPresenceOfElementLocated(expectedPageKeyword, expectedUIElementKeyword));
        select.deselectAll();
    }

    /**
     * 通过索引来选择select
     * @param locator        By 对象定位信息
     * @param index            索引
     */
    public static void selectByIndex(By locator,int index) {
        logger.info("通过索引来选择select,select定位是:【"+locator.toString()+"】,【索引值】:【"+index+"】");
        Select select = new Select(waitPresenceOfElementLocated(locator));
        select.selectByIndex(index);
    }

    /**
     * 通过索引来选择select
     * @param element        WebElement对象
     * @param index            索引
     */
    public static void selectByIndex(WebElement element,int index) {
        logger.info("通过索引来选择select,select定位是:【"+element.toString()+"】,【索引值】:【"+index+"】");
        Select select = new Select(element);
        select.selectByIndex(index);
    }
    
    /**
     * 通过索引值来选择select
     * @param expectedPageKeyword            预期页面
     * @param expectedUIElementKeyword        预期关键字     
     * @param index            索引值
     */
    public static void selectByIndex(String  expectedPageKeyword,String expectedUIElementKeyword,int index) {
        logger.info("通过索引值来选择select,select所在关键页面是:【"+expectedPageKeyword+"】,所在关键元素是【"+expectedUIElementKeyword+"】,【索引值】:【"+index+"】");
        Select select = new Select(waitPresenceOfElementLocated(expectedPageKeyword, expectedUIElementKeyword));
        select.selectByIndex(index);
    }
    
    /**
     * 通过value值来选择select
     * @param locator        By 对象定位信息
     * @param value            value值
     */
    public static void selectByValue(By locator,String  value) {
        logger.info("通过value值来选择select,select定位是:【"+locator.toString()+"】,【value值值】:【"+value+"】");
        Select select = new Select(waitPresenceOfElementLocated(locator));
        select.selectByValue(value);
    }

    /**
     * 通过value值来选择select
     * @param element        WebElement对象
     * @param value            value值
     */
    public static void selectByValue(WebElement element,String value) {
        logger.info("通过value值来选择select,select定位是:【"+element.toString()+"】,【value值值】:【"+value+"】");
        Select select = new Select(element);
        select.selectByValue(value);
    }
    
    /**
     * 通过value值来选择select
     * @param expectedPageKeyword            预期页面
     * @param expectedUIElementKeyword        预期关键字     
     * @param value            value值
     */
    public static void selectByValue(String  expectedPageKeyword,String expectedUIElementKeyword,String value) {
        logger.info("通过value值来选择select,select所在关键页面是:【"+expectedPageKeyword+"】,所在关键元素是【"+expectedUIElementKeyword+"】,【value值值】:【"+value+"】");
        Select select = new Select(waitPresenceOfElementLocated(expectedPageKeyword, expectedUIElementKeyword));
        select.selectByValue(value);
    }
    
    //
    /**
     * 通过可见文本值来选择select
     * @param locator        By 对象定位信息
     * @param text            可见文本值
     */
    public static void selectByVisibleText(By locator,String  text) {
        logger.info("通过可见文本值来选择select,select定位是:【"+locator.toString()+"】,【可见文本值】:【"+text+"】");
        Select select = new Select(waitPresenceOfElementLocated(locator));
        select.selectByVisibleText(text);
    }

    /**
     * 通过可见文本值来选择select
     * @param element        WebElement对象
     * @param text            可见文本值
     */
    public static void selectByVisibleText(WebElement element,String text) {
        logger.info("通过可见文本值来选择select,select定位是:【"+element.toString()+"】,【可见文本值】:【"+text+"】");
        Select select = new Select(element);
        select.selectByVisibleText(text);
    }
    
    /**
     * 通过可见文本值来选择select
     * @param expectedPageKeyword            预期页面
     * @param expectedUIElementKeyword        预期关键字     
     * @param text            可见文本值
     */
    public static void selectByVisibleText(String  expectedPageKeyword,String expectedUIElementKeyword,String text) {
        logger.info("通过可见文本值来选择select,select所在关键页面是:【"+expectedPageKeyword+"】,所在关键元素是【"+expectedUIElementKeyword+"】,【可见文本值】:【"+text+"】");
        Select select = new Select(waitPresenceOfElementLocated(expectedPageKeyword, expectedUIElementKeyword));
        select.selectByVisibleText(text);
    }
    
    /**
     * 确认alter弹框
     */
    public static void acceptAlert() {
        logger.info("确认alter弹框");
        Alert alert = getBroswer().switchTo().alert();
        alert.accept();
    }
    
    /**
     * 关闭浏览器
     */
    public static void closeBrowser() {
        logger.info("关闭浏览器");
        getBroswer().quit();
    }
    
    /**
     * 取消alter弹框
     */
    public static void dismissAlert() {
        logger.info("取消alter弹框");
        Alert alert = getBroswer().switchTo().alert();
        alert.dismiss();
        }
    

    /**
     *     检查给定元素是否被选中的期望值。
     * @param locator        By 对象定位信息
     * @param selected        预期的选中状态
     * @return        返回true,实际选中状态和预期选中状态一致,反之返回false
     */
    public static Boolean checkElementSelectionStateToBe(By locator,boolean selected) {
        logger.info("获取【locator定位信息】为:【"+locator.toString()+"】,检查select是否被选中,【预期选中状态】:【"+selected+"】");
        logger.info("返回的实际选中状态【"+ getWait().until(ExpectedConditions.elementSelectionStateToBe(locator, selected))+"】");
        return getWait().until(ExpectedConditions.elementSelectionStateToBe(locator, selected));
    }
    
    /**
     *     检查给定元素是否被选中的期望值。
     * @param expectedPageKeyword                    预期页面关键在
     * @param expectedUIElementKeyword                预期元素关键字     
     * @return        返回true,实际选中状态和预期选中状态一致,反之返回false
     */
    public static Boolean checkElementSelectionStateToBe(String expectedPageKeyword,String expectedUIElementKeyword,boolean selected ) {
        logger.info("获取【页面关键字】为:【"+expectedPageKeyword+"】,获取【元素关键字】为:【"+expectedUIElementKeyword+"】,检查select是否被选中");
        By locator = getXmlBy(expectedPageKeyword, expectedUIElementKeyword);
        logger.info("获取【locator定位信息】为:【"+locator.toString()+"】,检查select是否被选中");
        logger.info("返回的实际选中状态【"+ getWait().until(ExpectedConditions.elementSelectionStateToBe(locator, selected))+"】");
        return getWait().until(ExpectedConditions.elementSelectionStateToBe(locator, selected));
    }
    
    /**
     *     检查给定元素是否被选中的期望值。
     * @param element        需要判断的元素
     * @param selected        预期的选中状态
     * @return        返回true,实际选中状态和预期选中状态一致,反之返回false
     */
    public static Boolean checkElementSelectionStateToBe(WebElement element,boolean selected) {
        logger.info("获取【element元素信息】为:【"+element.toString()+"】,检查select是否被选中,【预期选中状态】:【"+selected+"】");
        logger.info("返回的实际选中状态【"+ getWait().until(ExpectedConditions.elementSelectionStateToBe(element, selected))+"】");
        return getWait().until(ExpectedConditions.elementSelectionStateToBe(element, selected));
    }
    
    
    
    /**
     *     检查给定元素是否被选中。
     * @param locator        By 对象定位信息
     * @return        已选择返回true,反之返回false
     */
    public static Boolean checkElementToBeSelected(By locator) {
        logger.info("获取【locator定位信息】为:【"+locator.toString()+"】,检查select被选中");
        logger.info("返回的实际选中状态【"+ getWait().until(ExpectedConditions.elementToBeSelected(locator))+"】");
        return getWait().until(ExpectedConditions.elementToBeSelected(locator));
    }
    
    /**
     *     检查给定元素是否被选中。
     * @param element        需要判断的元素
     * @param selected        预期的选中状态
     * @return        已选择返回true,反之返回false
     */
    public static Boolean checkElementToBeSelected(WebElement element) {
        logger.info("获取【element元素信息】为:【"+element.toString()+"】,检查select被选中");
        logger.info("返回的实际选中状态【"+ getWait().until(ExpectedConditions.elementToBeSelected(element))+"】");
        return getWait().until(ExpectedConditions.elementToBeSelected(element));
    }
    
    
    /**
     *     检查给定元素是否被选中。
     * @param expectedPageKeyword                    预期页面关键在
     * @param expectedUIElementKeyword                预期元素关键字     
     * @return        已选择返回true,反之返回false
     */
    public static Boolean checkElementToBeSelected(String expectedPageKeyword,String expectedUIElementKeyword ) {
        logger.info("获取【页面关键字】为:【"+expectedPageKeyword+"】,获取【元素关键字】为:【"+expectedUIElementKeyword+"】,检查select被选中");
        By locator = getXmlBy(expectedPageKeyword, expectedUIElementKeyword);
        logger.info("获取【locator定位信息】为:【"+locator.toString()+"】,检查select被选中");
        logger.info("返回的实际选中状态【"+ getWait().until(ExpectedConditions.elementToBeSelected(locator))+"】");
        return getWait().until(ExpectedConditions.elementToBeSelected(locator));
    }
    
    /**
     * 获取指定元素的实际文本,是否【等于】预期的文本值
     * @param locator        By 对象定位信息
     * @param value            预期的文本值
     * @return        等于返回true,反之返回false
     */
    public static Boolean checkTextToBe(By locator,String value) {
        logger.info("获取【locator定位信息】为:【"+locator.toString()+"】,预期的文本值【"+value+"】,获取指定元素的实际文本,是否【等于】预期的文本值");
        logger.info("获取【实际文本值】为:【"+waitPresenceOfElementLocated(locator).getText()+"】");
        logger.info("返回的文本与预期的文本是否相等状态:【"+ getWait().until(ExpectedConditions.textToBe(locator,value ))+"】");
        return getWait().until(ExpectedConditions.textToBe(locator, value));
    }
    
    /**
     * 获取指定元素的实际文本,是否【等于】预期的文本值
     * @param expectedPageKeyword                    预期页面关键在
     * @param expectedUIElementKeyword                预期元素关键字
     * @param value                                    预期的文本值
     * @return        等于返回true,反之返回false
     */
    public static Boolean checkTextToBe(String expectedPageKeyword,String expectedUIElementKeyword,String value) {
        logger.info("获取【页面关键字】为:【"+expectedPageKeyword+"】,获取【元素关键字】为:【"+expectedUIElementKeyword+"】,获取指定元素的实际文本,是否【等于】预期的文本值");
        By locator = getXmlBy(expectedPageKeyword, expectedUIElementKeyword);
        logger.info("获取【locator定位信息】为:【"+locator.toString()+"】,获取指定元素的实际文本,是否等于预期的文本值");
        logger.info("获取【实际文本值】为:【"+waitPresenceOfElementLocated(locator).getText()+"】");
        logger.info("返回的文本与预期的文本是否相等状态:【"+ getWait().until(ExpectedConditions.textToBe(locator,value ))+"】");
        return getWait().until(ExpectedConditions.textToBe(locator, value));
    }
    
    /**
     * 获取指定元素的实际文本,是否【包含】预期的文本值
     * @param locator        By 对象定位信息
     * @param value            预期的文本值
     * @return        等于返回true,反之返回false
     */
    public static Boolean checkTextToBePresentInElementLocated(By locator,String value) {
        logger.info("获取【locator定位信息】为:【"+locator.toString()+"】,预期的文本值【"+value+"】,,获取指定元素的实际文本,是否【包含】预期的文本值");
        logger.info("获取【实际文本值】为:【"+waitPresenceOfElementLocated(locator).getText()+"】");
        logger.info("返回的文本与预期的文本是否【相等】状态:【"+ getWait().until(ExpectedConditions.textToBePresentInElementLocated(locator, value))+"】");
        return getWait().until(ExpectedConditions.textToBePresentInElementLocated(locator, value));
    }
    
    /**
     * 获取指定元素的实际文本,是否【包含】预期的文本值
     * @param expectedPageKeyword                    预期页面关键在
     * @param expectedUIElementKeyword                预期元素关键字
     * @param value                                    预期的文本值
     * @return        等于返回true,反之返回false
     */
    public static Boolean checkTextToBePresentInElementLocated(String expectedPageKeyword,String expectedUIElementKeyword,String value) {
        logger.info("获取【页面关键字】为:【"+expectedPageKeyword+"】,获取【元素关键字】为:【"+expectedUIElementKeyword+"】,获取指定元素的实际文本,是否【包含】等于预期的文本值");
        By locator = getXmlBy(expectedPageKeyword, expectedUIElementKeyword);
        logger.info("获取【locator定位信息】为:【"+locator.toString()+"】,获取指定元素的实际文本,是否【包含】等于预期的文本值");
        logger.info("获取【实际文本值】为:【"+waitPresenceOfElementLocated(locator).getText()+"】");
        logger.info("返回的文本与预期的文本是否【包含】状态:【"+ getWait().until(ExpectedConditions.textToBePresentInElementLocated(locator,value ))+"】");
        return getWait().until(ExpectedConditions.textToBePresentInElementLocated(locator, value));
    }
    
    /**
     * 获取指定元素的实际文本,是否【包含】预期的文本值
     * @param element                                指定元素
     * @param value                                    预期的文本值
     * @return        等于返回true,反之返回false
     */
    public static Boolean checkTextToBePresentInElementLocated(WebElement element,String value) {
        logger.info("获取【element元素信息】为:【"+element.toString()+"】,预期的文本值【"+value+"】,获取指定元素的实际文本值获取指定元素的实际文本,是否【包含】等于预期的文本值");
        logger.info("获取【实际文本值】为:【"+element.getText()+"】");
        logger.info("返回的文本与预期的文本是否【包含】状态:【"+ getWait().until(ExpectedConditions.textToBePresentInElement(element, value))+"】");
        return getWait().until(ExpectedConditions.textToBePresentInElement(element, value));
    }
    
    /**
     * 获取指定元素的实际value属性值,是否【包含】预期的value属性值
     * @param element                                指定元素
     * @param value                                    预期value
     * @return        等于返回true,反之返回false
     */
    public static Boolean checkTextToBePresentInElementValue(WebElement element,String value) {
        logger.info("获取【element元素信息】为:【"+element.toString()+"】,预期的value值【"+value+"】,获取指定元素的实际value值获取指定元素的实际文本,是否【包含】等于预期的value值");
        logger.info("获取【实际value值】为:【"+element.getAttribute("value")+"】");
        logger.info("返回的文本与预期的文本是否【包含】状态:【"+ getWait().until(ExpectedConditions.textToBePresentInElementValue(element, value))+"】");
        return getWait().until(ExpectedConditions.textToBePresentInElementValue(element, value));
    }
    
    /**
     * 获取指定元素的实际value属性值,是否【包含】预期的value属性值
     * @param locator        By 对象定位信息
     * @param value            预期value值
     * @return        等于返回true,反之返回false
     */
    public static Boolean checkTextToBePresentInElementValue(By locator,String value) {
        logger.info("获取【locator定位信息】为:【"+locator.toString()+"】,预期的文本值【"+value+"】,获取指定元素的实际value值,获取指定元素的实际value属性值,是否【包含】等于预期的value属性值");
        logger.info("获取【实际value值】为:【"+waitPresenceOfElementLocated(locator).getAttribute("value")+"】");
        logger.info("返回的实际value值与预期的value值是否【包含】状态:【"+ getWait().until(ExpectedConditions.textToBePresentInElementValue(locator, value))+"】");
        return getWait().until(ExpectedConditions.textToBePresentInElementValue(locator, value));
    }
    
    /**
     * 获取指定元素的实际value属性值,是否【包含】预期的value属性值
     * @param expectedPageKeyword                    预期页面关键在
     * @param expectedUIElementKeyword                预期元素关键字
     * @param value                                    预期的文本值
     * @return        等于返回true,反之返回false
     */
    public static Boolean checkTextToBePresentInElementValue(String expectedPageKeyword,String expectedUIElementKeyword,String value) {
        logger.info("获取【页面关键字】为:【"+expectedPageKeyword+"】,获取【元素关键字】为:【"+expectedUIElementKeyword+"】,【预期的属性值】:【"+value+"】获取指定元素的实际value属性值,是否【包含】等于预期的value属性值");
        By locator = getXmlBy(expectedPageKeyword, expectedUIElementKeyword);
        logger.info("获取【locator定位信息】为:【"+locator.toString()+"】,获取指定元素的实际value属性值,是否【包含】等于预期的value属性值");
        logger.info("获取【实际value值】为:【"+waitPresenceOfElementLocated(locator).getAttribute("value")+"】");
        logger.info("返回的实际value值与预期的value值是否【包含】状态:【"+ getWait().until(ExpectedConditions.textToBePresentInElementValue(locator,value ))+"】");
        return getWait().until(ExpectedConditions.textToBePresentInElementValue(locator, value));
    }

    /**
     * 获取指定元素的实际属性,是否【包含】预期的属性值
     * @param element                                指定元素
     * @param attribute                                指定属性名
     * @param value                                    预期value
     * @return        等于返回true,反之返回false
     */
    public static Boolean checkAttributeContains(WebElement element,String attribute,String value) {
        logger.info("获取【element元素信息】为:【"+element.toString()+"】,指定的【属性名】:【"+attribute+"】,【预期的属性值】:"+value+",获取指定元素的实际属性是否【包含】等于预期的属性值");
        logger.info("获取【实际属性值】为:【"+element.getAttribute(attribute)+"】");
        logger.info("返回的文本与预期的文本是否【包含】状态:【"+ getWait().until(ExpectedConditions.attributeContains(element, attribute, value))+"】");
        return getWait().until(ExpectedConditions.attributeContains(element, attribute, value));
    }
    
    /**
     * 检查alter弹框是否存在
     * @return  true存在,false不存在
     */
    public boolean checkAlertIsPresent() {
        try {
            logger.info("开始检查alter是否存在");
            getWait().until(ExpectedConditions.alertIsPresent());
            logger.info("开始检查alter存在");
            return true;
        }catch (Exception e) {
            logger.info("开始检查alter不存在");
            return false;
        }
    }
    
    /**
     * 检查页面元素是否可见
     * @param locator
     * @return 如果返回为true,页面不可见或者元素不再dom中,返回false,页面可见
     */
    public static boolean checkInvisibilityOfElementLocated(By locator) {
        logger.info("检查元素是否不可见或页面不存在,【元素信息】:【"+locator.toString()+"】");
        logger.info("检查元素是否不可见或页面的状态:【"+getWait().until(ExpectedConditions.invisibilityOfElementLocated(locator))+"】");
        return getWait().until(ExpectedConditions.invisibilityOfElementLocated(locator));
    }
    
    /**
     * 获取指定元素的实际属性,是否【包含】预期的属性值
     * @param expectedPageKeyword                    预期页面关键在
     * @param expectedUIElementKeyword                预期元素关键字
     * @param attribute                                指定属性名
     * @param value                                    预期的文本值
     * @return        等于返回true,反之返回false
     */
    public static Boolean checkAttributeContains(String expectedPageKeyword,String expectedUIElementKeyword,String attribute,String value) {
        logger.info("获取【页面关键字】为:【"+expectedPageKeyword+"】,获取【元素关键字】为:【"+expectedUIElementKeyword+"】,指定的【属性名】:【"+attribute+"】,【预期的属性值】:"+value+",获取指定元素的实际属性是否【包含】等于预期的属性值");
        By locator = getXmlBy(expectedPageKeyword, expectedUIElementKeyword);
        logger.info("获取【locator定位信息】为:【"+locator.toString()+"】,获取指定元素的实际属性值,是否【包含】等于预期的属性值");
        logger.info("获取【实际属性值】为:【"+waitPresenceOfElementLocated(locator).getAttribute(attribute)+"】");
        logger.info("返回的实际属性值与预期的属性值是否【包含】状态:【"+ getWait().until(ExpectedConditions.attributeContains(locator, attribute, value))+"】");
        return getWait().until(ExpectedConditions.attributeContains(locator, attribute, value));
    }
    
    /**
     * 获取指定元素的实际属性,是否【包含】预期的属性值
     * @param expectedPageKeyword                    预期页面关键在
     * @param expectedUIElementKeyword                预期元素关键字
     * @param attribute                                指定属性名
     * @param value                                    预期的文本值
     * @return        等于返回true,反之返回false
     */
    public static Boolean checkAttributeContains(By locator,String attribute,String value) {
        logger.info("获取【locator定位信息】为:【"+locator.toString()+"】,【指定的属性名】:【"+attribute+"】,【指定的预期属性值】:【"+value+"】,获取指定元素的实际属性值,是否【包含】等于预期的属性值");
        logger.info("获取【实际属性值】为:【"+waitPresenceOfElementLocated(locator).getAttribute(attribute)+"】");
        logger.info("返回的实际属性值与预期的属性值是否【包含】状态:【"+ getWait().until(ExpectedConditions.attributeContains(locator, attribute, value))+"】");
        return getWait().until(ExpectedConditions.attributeContains(locator, attribute, value));
    }
    
    /**
     * 获取指定元素的实际属性,是否【等于】预期的属性值
     * @param element                                指定元素
     * @param attribute                                指定属性名
     * @param value                                    预期value
     * @return        等于返回true,反之返回false
     */
    public static Boolean checkAttributeToBe(WebElement element,String attribute,String value) {
        logger.info("获取【element元素信息】为:【"+element.toString()+"】,指定的【属性名】:【"+attribute+"】,【预期的属性值】:"+value+",获取指定元素的实际属性是否【等于】等于预期的属性值");
        logger.info("获取【实际属性值】为:【"+element.getAttribute(attribute)+"】");
        logger.info("返回的文本与预期的文本是否【等于】状态:【"+ getWait().until(ExpectedConditions.attributeToBe(element, attribute, value))+"】");
        return getWait().until(ExpectedConditions.attributeToBe(element, attribute, value));
    }
    
    /**
     * 获取指定元素的实际属性,是否【等于】预期的属性值
     * @param expectedPageKeyword                    预期页面关键在
     * @param expectedUIElementKeyword                预期元素关键字
     * @param attribute                                指定属性名
     * @param value                                    预期的文本值
     * @return        等于返回true,反之返回false
     */
    public static Boolean checkAttributeToBe(String expectedPageKeyword,String expectedUIElementKeyword,String attribute,String value) {
        logger.info("获取【页面关键字】为:【"+expectedPageKeyword+"】,获取【元素关键字】为:【"+expectedUIElementKeyword+"】,指定的【属性名】:【"+attribute+"】,【预期的属性值】:"+value+",获取指定元素的实际属性是否【等于】等于预期的属性值");
        By locator = getXmlBy(expectedPageKeyword, expectedUIElementKeyword);
        logger.info("获取【locator定位信息】为:【"+locator.toString()+"】,获取指定元素的实际属性值,是否【等于】等于预期的属性值");
        logger.info("获取【实际属性值】为:【"+waitPresenceOfElementLocated(locator).getAttribute(attribute)+"】");
        logger.info("返回的实际属性值与预期的属性值是否【等于】状态:【"+ getWait().until(ExpectedConditions.attributeToBe(locator, attribute, value))+"】");
        return getWait().until(ExpectedConditions.attributeToBe(locator, attribute, value));
    }
    
    /**
     * 获取指定元素的实际属性,是否【等于】预期的属性值
     * @param expectedPageKeyword                    预期页面关键在
     * @param expectedUIElementKeyword                预期元素关键字
     * @param attribute                                指定属性名
     * @param value                                    预期的文本值
     * @return        等于返回true,反之返回false
     */
    public static Boolean checkAttributeToBe(By locator,String attribute,String value) {
        logger.info("获取【locator定位信息】为:【"+locator.toString()+"】,【指定的属性名】:【"+attribute+"】,【指定的预期属性值】:【"+value+"】,获取指定元素的实际属性值,是否【等于】等于预期的属性值");
        logger.info("获取【实际属性值】为:【"+waitPresenceOfElementLocated(locator).getAttribute(attribute)+"】");
        logger.info("返回的实际属性值与预期的属性值是否【等于】状态:【"+ getWait().until(ExpectedConditions.attributeToBe(locator, attribute, value))+"】");
        return getWait().until(ExpectedConditions.attributeToBe(locator, attribute, value));
    }
    
//    public void test() throws InterruptedException {
//        //把“随意拖拽1-1”元素移动到“随意拖拽1-2”节点下去
//        WebElement webElement1 = BrowserUtil.driver.findElement(By.id("treeDemo_2_span"));
//        WebElement webElement2= BrowserUtil.driver.findElement(By.id("treeDemo_3_span"));
//        //构建鼠标的一连串动作
//        Actions actions = new Actions(BrowserUtil.driver);
//        actions.clickAndHold(webElement1).moveToElement(webElement2).release().build().perform();
//    }

    
    public static By getXmlBy(String path ,String expectedPageKeyword,String expectedUIElementKeyword) {
        try {
        String uiElementBy = "";
        String uiElementValue = "";
        for(Page page:XmlUtils.loadXml(path)) {
            String actualPageKeyword = page.getKeyword();
            if (expectedPageKeyword.equals(actualPageKeyword)) {
                for (UIElement uiElement : page.getUiElementList()) {
                    String actualUiElement = uiElement.getKeyword();
                    if (expectedUIElementKeyword.equals(actualUiElement)) {
                        uiElementBy = uiElement.getBy();
                        uiElementValue = uiElement.getValue();
                    }
                }
            }
        }
        Class<By> clazz = By.class;
        Method method = clazz.getMethod(uiElementBy, String.class);
        By by =(By) method.invoke(null, uiElementValue);
        return by;}catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    public static By getXmlBy(String expectedPageKeyword,String expectedUIElementKeyword) {
        try {
        String uiElementBy = "";
        String uiElementValue = "";
        for(Page page:XmlUtils.loadXml("")) {
            String actualPageKeyword = page.getKeyword();
            if (expectedPageKeyword.equals(actualPageKeyword)) {
                for (UIElement uiElement : page.getUiElementList()) {
                    String actualUiElement = uiElement.getKeyword();
                    if (expectedUIElementKeyword.equals(actualUiElement)) {
                        uiElementBy = uiElement.getBy();
                        uiElementValue = uiElement.getValue();
                    }
                }
            }
        }
        Class<By> clazz = By.class;
        Method method = clazz.getMethod(uiElementBy, String.class);
        By by =(By) method.invoke(null, uiElementValue);
        return by;
        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    //=======================================Js部分=========================================================
    

    /**
     * Selenium定位的元素被图层遮挡,click无法操作,可以用此方法点击
     * @param webElement        需要操作的元素
     */
    public static void clickByJs(WebElement webElement) {
        logger.info(webElement.toString());
        getJs().executeScript("arguments[0].click();", webElement);
    }
    
    
    /**
     * 去除元素只读属性
     * @param webElement        需要操作的元素
     */
    public static void removeAttributeReadonly(WebElement webElement) {
        getJs().executeScript("arguments[0].removeAttribute('readonly')",webElement);
    }
    
    /**
     * 文本输入框赋值
     * @param webElement        需要操作的元素
     * @param input                期望输入的值
     * 注意: JS企图去控制输入框的值失效,是因为没有触发input或change事件(有些前端会设置)
     */
    public static void modifyValueByJs(WebElement webElement,String input) {
        getJs().executeScript("arguments[0].value=arguments[1]",webElement,input);
    }
    
    /**
     * 设置富文本框的内容
     * @param webElement        需要操作的元素
     * @param input                期望输入的值
     */
    public static void modifyInnerHTMLByJs(WebElement webElement,String input) {
        getJs().executeScript("arguments[0].innerHTML = arguments[1]" ,webElement,input);
    }
    
    /**
     * 利用js代码取出关键字
     * @param webElement        需要操作的元素
     * @return                    返回获取的value值
     */
    public static String getValueByJs(WebElement webElement) {
        return (String) getJs().executeScript("var result=arguments[0].value;return result",webElement);

    }


    /**
     * 用js判断页面加载完毕,返回complete
     * @return    返回complete
     */
    public static String judgeLoadComplete() {
        return getJs().executeScript("return document.readyState").toString();
    }
    
    /**
     * 获取富文本框内容
     * @param webElement        需要操作的元素
     * @return 返回获取的innerHTML
     */
    public static String getInnerHTMLByJs(WebElement webElement) {
        return (String) getJs().executeScript("var result=arguments[0].innerHTML;return result" ,webElement);
    }
    
    /**
     * 滑动页面到指定元素的顶部对其
     * @param webElement        需要操作的元素
     */
    public static void scrollIntoTopView(WebElement webElement) {
        getJs().executeScript("arguments[0].scrollIntoView(true);",webElement);
    }
    
    /**
     * 滑动页面到指定元素的顶部底部
     * @param webElement        需要操作的元素
     */
    public static void scrollInTobottomView(WebElement webElement) {
        getJs().executeScript("arguments[0].scrollIntoView(false);",webElement);
    }
    
    /**
     * 元素滚动至可见位置_如果当前可见,则不会发生滚动
     * @param webElement        需要操作的元素
     */
    public static void scrollIntoViewIfNeeded(WebElement webElement) {
        getJs().executeScript("arguments[0].scrollIntoViewIfNeeded(true);",webElement);
    }
    
    /**
     *     封装设置或者新增页面对象的属性值的方法 调用JS代码修改页面元素的属性值,arguments[0]~arguments[1]分别
     *     会用后面的element,attributeName和value参数进行替换
     * @param webElement        需要操作的元素
     * @param attributeName        属性名
     * @param attributeValue    属性值
     */
    public static void setAttribute(WebElement webElement,String attributeName,String attributeValue) {
        getJs().executeScript("arguments[0].setAttribute(\""+attributeName+"\",\""+attributeValue+"\")",webElement,attributeName,attributeValue);

    }
    
    /**
     *     删除元素指定元素属性
     * @param webElement        需要操作的元素
     * @param attributeName        属性名
     */
    public static void removeAttribute(WebElement webElement,String attributeName) {
        getJs().executeScript("arguments[0].removeAttribute(arguments[1])",webElement,attributeName);
    }
    
    /**
     * 获取指定元素对应的属性值
     * @param webElement        需要操作的元素
     * @param attributeName        属性名
     * @return     返回指定元素对应的属性值
     */
    public static String getAttribute(WebElement webElement,String attributeName) {
        logger.info("浏览器信息和获取的元素信息:【"+webElement.toString()+"】,获取该元素属性名为【"+attributeName+"】,属性值值为【"+(String)getJs().executeScript("return arguments[0].getAttribute(arguments[1])",webElement,attributeName)+"】");
        return (String)getJs().executeScript("return arguments[0].getAttribute(arguments[1])",webElement,attributeName);        
    }
    
    /**
     * 元素高亮展示            #边框border:2px; blue红色
     * @param webElement        需要操作的元素
     */
    public static void setHighLight(WebElement webElement) {
        logger.info("浏览器信息和获取的元素信息:【"+webElement.toString()+"】,设置了【style】属性,其属性值为【border: 10px solid blue;】,其目的是高亮显示元素");
        setAttribute(webElement, "style", "border: 10px solid blue;");
    }
    
    
    //=======================================正则表达式替换修改xml部分===========================================
    
    
    /**
     * 替换${格式的信息}
     * @param expectedPageKeyword
     * @param expectedUIElementKeyword
     * @param modifyValue
     */
    public static void replaceValue(String expectedPageKeyword,String expectedUIElementKeyword,String modifyValue) {
//        XmlUtils.(expectedPageKeyword, expectedUIElementKeyword, modifyValue, "\\$\\{.+\\}");
    }
    
    
    /**
     * 替换中文字符为S{XXX}
     * @param expectedPageKeyword
     * @param expectedUIElementKeyword
     * @param modifyValue
     */
    public static void replaceChinese(String expectedPageKeyword,String expectedUIElementKeyword,String modifyValue) {
//        XmlUtil.modifyXmlInfo(expectedPageKeyword, expectedUIElementKeyword, modifyValue, "[\\x{4e00}-\\x{9fa5}]+");
    }
    
    
    
    
    //机动车综合险2020版
    
    /**
     * 将中文字符替换为 S{XXX}
     * @param expectedPageKeyword
     * @param expectedUIElementKeyword
     * @param modifyValue
     */
    public static void replaceChineseNum(String expectedPageKeyword,String expectedUIElementKeyword,String modifyValue) {
//        XmlUtil.modifyXmlInfo(expectedPageKeyword, expectedUIElementKeyword, modifyValue, "[0-9\\x{4e00}-\\x{9fa5}]+");
    }
    
    /**
     * 匹配中文和带-的
     * @param expectedPageKeyword
     * @param expectedUIElementKeyword
     * @param modifyValue
     */
    public static void replaceChineseNum1(String expectedPageKeyword,String expectedUIElementKeyword,String modifyValue) {
//        XmlUtil.modifyXmlInfo(expectedPageKeyword, expectedUIElementKeyword, modifyValue, "[\\\\-\\x{4e00}-\\x{9fa5}]+");
    }

}

 

posted @ 2021-03-15 00:53  何日才能成为大神  阅读(181)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3