java + Selenium 实现自动化测试,模拟人手点击操作 chrome 浏览器

引入 maven 依赖:

 <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.141.59</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>22.0</version>
        </dependency>

安装 chromeDriver:略

SeleniumUtils.java:

import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.html5.LocalStorage;

import java.util.List;
import java.util.Set;

/**
 * 快速获取 xpath:鼠标点击指定空间,鼠标右键 "检查",打开 "元素" tab 页,点击指定标签,右键,点击 "复制",点击 "复制 xpath"
 */
public class SeleniumUtils {

    private static ChromeDriver chromeDriver = null;

    public static void open( String url) {
        if( chromeDriver == null ){
            SeleniumUtils.initChromeDriver();
        }
        SeleniumUtils.chromeDriver.get( url );
        try {
            Thread.sleep( 10L );
        }catch ( Exception e ){
            e.printStackTrace();
        }
    }

    private static void initChromeDriver() {
        // ps:chromedriver.exe 的版本要和 chrome 浏览器的版本一致( 大版本一致,最后的小版本可以不一致 )
        // ChromeDriverUtil chromeDriverUtil = ChromeDriverUtil.build("D:\\install\\chromedriver\\chromedriver.exe");
        ChromeDriverUtils chromeDriverUtil = ChromeDriverUtils.build("D:\\install\\chromedriver2\\chromedriver.exe");
        ChromeDriver chromeDriver = chromeDriverUtil.getDriver();
        LocalStorage localStorage = chromeDriver.getLocalStorage();
        System.out.println( "localStorage=" + localStorage );
        Set<String> keySet = localStorage.keySet();
       /* for( String key:keySet ){
            System.out.println( key + "=" + localStorage.getItem( key ) );
        }*/
        SeleniumUtils.chromeDriver = chromeDriver;
    }

    public static void setValueForInput( String inputXpath,String value,String inputName ) {
        if( SeleniumUtils.chromeDriver == null ){
            SeleniumUtils.initChromeDriver();
        }
        WebElement input = SeleniumUtils.chromeDriver.findElementByXPath( inputXpath );
        System.out.println( inputName + " input="+input );
        input.clear();
        input.sendKeys( value );
        try {
            Thread.sleep( 200L );
        }catch ( Exception e ){
            e.printStackTrace();
        }
    }

    public static void setValueForSelect( String selectXpath,String value,String selectName ) {
        if( SeleniumUtils.chromeDriver == null ){
            SeleniumUtils.initChromeDriver();
        }
        WebElement select = SeleniumUtils.chromeDriver.findElementByXPath( selectXpath );
        System.out.println( selectName + " select="+select );
        select.sendKeys( value );
        try {
            Thread.sleep( 200L );
        }catch ( Exception e ){
            e.printStackTrace();
        }
    }

    public static void clickButton( String buttonXpath,String buttonName) {
        if( SeleniumUtils.chromeDriver == null ){
            SeleniumUtils.initChromeDriver();
        }
        List<WebElement> buttons = SeleniumUtils.chromeDriver.findElementsByXPath(buttonXpath);
        if( buttons == null || buttons.size() == 0 ){
            return;
        }
        WebElement button = buttons.get(0);
        System.out.println( buttonName + " button=" + button );
      /*  Point location = button.getLocation();
        System.out.println( location.getX() );
        System.out.println( location.getY() );*/
        button.click();
        try {
            Thread.sleep( 200L );
        }catch ( Exception e ){
            e.printStackTrace();
        }
       /* chromeBrowser.setLocation( new Location( location.getX(),location.getY(),0 ));
        button_login.click();*/
    }
}

ChromeDriverUtils.java:

import lombok.SneakyThrows;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.io.File;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

public class ChromeDriverUtils {
    //文件版本,防止多线程缓存文件和用户文件共享,导致创建错误
    private  static  AtomicInteger fileSerial=new AtomicInteger(0);
    private ChromeDriver driver;

    public ChromeDriverUtils(String path, boolean pd, boolean img) {
        init(path, pd, img);
    }

    @SneakyThrows
    private void init(String path, boolean pd, boolean img) {
        System.setProperty("webdriver.chrome.driver", path);
        ChromeOptions options = new ChromeOptions();
        if (!pd) {
            options.addArguments("--headless"); //无浏览器模式
        }
        options.addArguments("--disable-gpu"); // 谷歌文档提到需要加上这个属性来规避bug
        options.addArguments("--disable-software-rasterizer"); //禁用3D软件光栅化器
        options.addArguments("--no-sandbox");// 为了让linux root用户也能执行
        // 优化参数
        options.addArguments("--disable-dev-shm-usage"); //解决在某些VM环境中,/dev/shm分区太小,导致Chrome失败或崩溃
        if (img) {
            options.addArguments("blink-settings=imagesEnabled=false"); //禁止加图片,如果爬取图片的话,这个不能禁用
            options.addArguments("--disable-images");
        }

        String tmpdir = System.getProperty("java.io.tmpdir");
        String dir = tmpdir + File.separator + "chrome_file_data_cache"+File.separator+fileSerial.incrementAndGet();
        File file1 = new File(dir+File.separator + "data");
        if(file1.exists()){
            file1.mkdirs();
        }
        File file2 = new File(dir+File.separator + "cache");
        if(file2.exists()){
            file1.mkdirs();
        }

        options.addArguments("--user-data-dir=" + file1.getAbsolutePath()); //解决打开页面出现data;空白页面情况,因为没有缓存目录
        options.addArguments("--disk-cache-dir=" + file2.getAbsolutePath()); //指定Cache路径
        options.addArguments("--incognito") ; //无痕模式
        options.addArguments("--disable-plugins"); //禁用插件,加快速度
        options.addArguments("--disable-extensions"); //禁用扩展
        options.addArguments("--disable-popup-blocking"); //关闭弹窗拦截
        options.addArguments("--ignore-certificate-errors"); //  禁现窗口最大化
        options.addArguments("--allow-running-insecure-content");  //关闭https提示 32位
        options.addArguments("--disable-infobars");  //禁用浏览器正在被自动化程序控制的提示  ,但是高版本不生效

        if (!pd) {
            //无浏览器模式-最大化窗口  ,防止有些元素被隐藏
            int screenWidth = ((int) java.awt.Toolkit.getDefaultToolkit().getScreenSize().width);
            int screenHeight = ((int) java.awt.Toolkit.getDefaultToolkit().getScreenSize().height);
            options.addArguments("window-size=" + screenWidth + "," + screenHeight);
        }
        //随机设置请求头
        // options.addArguments("--user-agent=" + UserAgent.getUserAgentWindows());
        proxy(options, false); //设置代理 ,true 开启代理
        driver = new ChromeDriver(options);//实例化
        if (pd) {
            driver.manage().window().maximize(); //界面的方式, 最大化窗口, 防止有些元素被隐藏,无界面就不要使用了
        }
        //当我们去定位页面元素时,如果元素没有找到,不会立即抛出异常,而是周期性地(通常为 0.5s)去重新寻找,直到该元素找到或者超过最大等待时间才结束 ,超时后就报错NoTouchElementException
        //当我们使用implicitly_wait()时,如果想要定位的元素已经找到,但是它的内容(如文本内容,属性等)没有加载出来,此时隐式等待无效,仍会直接抛出NoSuchElementException异常,这也是为什么我们很多时候仍需要使用time.sleep()的原因。
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

    }

    //无头模式,不加载图片
    public static ChromeDriverUtils buildHide(String path) {
        return new ChromeDriverUtils(path, false, true);
    }

    //无头模式,加载图片
    public static ChromeDriverUtils buildHideImg(String path) {
        return new ChromeDriverUtils(path, false, false);
    }

    //显示游览器 ,全功能
    public static ChromeDriverUtils build(String path) {
        return new ChromeDriverUtils(path, true, false);
    }

    public ChromeDriver getDriver() {
        return driver;
    }

    //强制等待 代码在执行到某个位置时强制等待一段时间
    @SneakyThrows
    public void sleep(long ms) {
        Thread.sleep(ms);
    }

    // 显示等待,是为了解决隐式等待遗留的问题,比如元素显示了,但是内部的文本没有显示出来,可能文本是通过ajax异步的会比较慢
    public WebElement wait(int seconds, ExpectedCondition<WebElement> expectedCondition) {
        WebDriverWait webDriverWait = new WebDriverWait(driver, seconds);
        //返回null或者false,等待500毫秒继续尝试,直到过期
        WebElement until = webDriverWait.until(expectedCondition);

        return until;
    }

    //自行扩展, 从接口中读取,或者从文件中读取都行
    private void proxy(ChromeOptions options, boolean pd) {
        if (pd) {
            String prox = "101.200.127.149:" + 3129;
            Proxy p = new Proxy();
            p.setHttpProxy(prox);//http
//        p.setFtpProxy(prox); //ftp
//        p.setSslProxy(prox);//ssl
//        p.setSocksProxy(prox); //SOCKS
//        p.setSocksUsername("");
//        p.setSocksPassword("");

            options.setProxy(p);
        }
    }

    //截图
   /* public void screenshotPNG(TakesScreenshot takesScreenshot, File file) {
        byte[] screenshotAs1 = takesScreenshot.getScreenshotAs(OutputType.BYTES);
        ReadWriteFileUtils.writeByte(screenshotAs1, file);
        try (
                FileOutputStream fos1 = new FileOutputStream(file);
                BufferedOutputStream fos = new BufferedOutputStream(fos1);
        ) {
            fos.write(screenshotAs1, 0, screenshotAs1.length); // 写入数据
        } catch (Exception e) {
            e.printStackTrace();
        }
    }*/

}


使用示例:

public class SeleniumTest {

    public static void main(String[] args) throws InterruptedException {
        // 打开登录页面
        SeleniumUtils.open( "http://127.0.0.1" );

        // 设置用户名
        SeleniumUtils.setValueForInput( "//*[@id=\"username\"]","admin","用户名" );

        // 设置密码
        SeleniumUtils.setValueForInput( "//*[@id=\"password\"]","123456","密码" );

        // 点击登录按钮
        SeleniumUtils.clickButton( "//*[@id=\"login\"]/table/tbody/tr/td[2]/div/div[5]/button","登录" );

        // 打开 "预览" 页面
        SeleniumUtils.open( "http://127.0.0.1/doc/page/preview.asp" );

        // 点击 "配置" tab页
        SeleniumUtils.clickButton( "//*[@id=\"nav\"]/li[5]/a","配置" );

        // 点击 左侧 "网络" 菜单
        SeleniumUtils.clickButton( "//*[@id=\"menu\"]/div/div[3]/div[1]/span[2]","网络" );

        // 点击 "高级配置" 菜单
        SeleniumUtils.clickButton( "//*[@id=\"menu\"]/div/div[3]/div[3]","高级配置" );

        // 点击 "平台接入" tab页
        SeleniumUtils.clickButton( "//*[@id=\"ui-id-11\"]","平台接入" );

        // 设置平台接入方式为 "28181"
        SeleniumUtils.setValueForSelect( "//*[@id=\"advancedPlatform\"]/div/div[2]/span[2]/select","28181","平台接入方式" );

        // 设置 "SIP服务器ID"
        SeleniumUtils.setValueForInput( "//*[@id=\"advancedPlatform\"]/div/div[4]/div[3]/span[2]/input","111111111","SIP服务器ID" );

        // 设置 "SIP服务器域"
        SeleniumUtils.setValueForInput( "//*[@id=\"advancedPlatform\"]/div/div[4]/div[4]/span[2]/input","111111","SIP服务器域" );

        // 设置 "SIP服务器地址"
        SeleniumUtils.setValueForInput( "//*[@id=\"advancedPlatform\"]/div/div[4]/div[5]/span[2]/input","127.0.0.1","SIP服务器地址" );

        // 设置 "SIP服务器端口"
        SeleniumUtils.setValueForInput( "//*[@id=\"advancedPlatform\"]/div/div[4]/div[6]/span[2]/input","10000","SIP服务器端口" );

        // 设置 "SIP用户名"
        SeleniumUtils.setValueForInput( "//*[@id=\"advancedPlatform\"]/div/div[4]/div[7]/span[2]/input","111111","SIP用户名" );

        // 设置 "SIP用户认证ID"
        SeleniumUtils.setValueForInput( "//*[@id=\"advancedPlatform\"]/div/div[4]/div[8]/span[2]/input","111111","SIP用户认证ID" );

        // 设置 "密码"
        SeleniumUtils.setValueForInput( "//*[@id=\"advancedPlatform\"]/div/div[4]/div[9]/div[1]/span[2]/input","admin111","密码" );

        // 设置 "密码确认"
        SeleniumUtils.setValueForInput( "//*[@id=\"advancedPlatform\"]/div/div[4]/div[9]/div[2]/span[2]/input","123456","密码确认" );

        // 点击 "保存"
        SeleniumUtils.clickButton( "//*[@id=\"advancedPlatform\"]/button","保存" );

        // 点击 "视音频"
        SeleniumUtils.clickButton( "//*[@id=\"menu\"]/div/div[4]","视音频" );

        // 视频编码设置为 h.264
        SeleniumUtils.setValueForSelect( "//*[@id=\"video\"]/div[1]/div[12]/span[2]/select","0","视频编码" );

        // 点击 "保存"
        SeleniumUtils.clickButton( "//*[@id=\"video\"]/div[2]/span[2]/button","保存" );
    }
}

猜你喜欢

转载自blog.csdn.net/heshiyuan1406146854/article/details/131421294
今日推荐