selenium 入门(Java)

核能气质少年 提交于 2020-11-16 00:24:46

官网:https://www.seleniumhq.org/

下载地址:https://sites.google.com/a/chromium.org/chromedriver/downloads

华为镜像地址:https://mirrors.huaweicloud.com/chromedriver/

阿里镜像地址:https://npm.taobao.org/mirrors/chromedriver/

下载时,浏览器版本与 selenium 驱动版本要对应。

 

引入依赖,这里测试了 chrome 与 ie

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-chrome-driver</artifactId>
    <version>3.141.59</version>
    <exclusions>
        <exclusion>
            <artifactId>guava</artifactId>
            <groupId>com.google.guava</groupId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-ie-driver</artifactId>
    <version>3.141.59</version>
    <exclusions>
        <exclusion>
            <artifactId>guava</artifactId>
            <groupId>com.google.guava</groupId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>28.0-jre</version>
</dependency>
View Code

 

一、HelloWorld

打开浏览器,打开网页,关闭浏览器。

static {
    // IE浏览器   (webdriver.ie.driver)
    // 火狐浏览器 (webdriver.gecko.driver)
    // 谷歌浏览器 (webdriver.chrome.driver)

    System.setProperty("webdriver.chrome.driver", "D:\\selenium\\chromedriver.exe");
    System.setProperty("webdriver.chrome.bin", "D:\\selenium\\chrome.exe");

    System.setProperty("webdriver.ie.driver", "D:\\selenium\\IEDriverServer.exe");
    System.setProperty("webdriver.ie.bin", "C:\\Program Files\\internet explorer\\iexplore.exe");
}

/**
 * https://www.seleniumhq.org/download/
 * https://sites.google.com/a/chromium.org/chromedriver/downloads
 */
public static void main(String[] args) {
    // chrome();
    ie();
}

public static void chrome() {
    WebDriver driver = null;
    try {
        // InternetExplorerDriver() 浏览器
        // FirefoxDriver()          火狐浏览器
        // ChromeDriver()           谷歌浏览器
        driver = new ChromeDriver();

        driver.get("https://www.baidu.com/");

        Thread.sleep(5000);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (driver != null) {
            // 关闭浏览器当前窗口
            driver.close();
            // 退出 webdriver 并关闭浏览器
            driver.quit();
        }
    }
}


/**
 * Internet 选项->安全:四个区域的保护模式全部去掉勾选
 * regedit
 * \HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\(0-4) 2500(0->3)
 */
public static void ie() {
    WebDriver driver = null;
    try {
        driver = new InternetExplorerDriver();
        driver.get("https://www.baidu.com/");

        Thread.sleep(5000);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (driver != null) {
            driver.close();
            driver.quit();
        }
    }
}
View Code

 

二、查找元素节点并获取元素信息

selenium 使用的时 xpath 语法

注意 iframe 标签,需要先切换(driver.switchTo().frame(element))才能获取其中的元素。

static {
    System.setProperty("webdriver.chrome.driver", "D:\\selenium\\chromedriver.exe");
    System.setProperty("webdriver.chrome.bin", "D:\\selenium\\chrome.exe");
}

public static void main(String[] args) {
    WebDriver driver = null;
    try {
        driver = new ChromeDriver();
        driver.get("https://www.baidu.com/");

        // 在定位元素时,对所有元素设置超时时间,超出了设置时间则抛出异常
        driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);


        // xpath
        WebElement element = driver.findElement(By.xpath("//a[@id='jgwab']"));

        System.out.println(element.getText());
        System.out.println(element.getAttribute("target"));

        // 选择器
        element = driver.findElement(By.className("qrcode-text")).findElement(By.className("sub-title"));
        System.out.println(element.getText());
        System.out.println(element.getTagName());

        Thread.sleep(5000);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (driver != null) {
            driver.close();
            driver.quit();
        }
    }
}
View Code

 

三、动作链

找到元素节点后,对节点进行点击、输入、滑动等操作。

static {
    System.setProperty("webdriver.chrome.driver", "D:\\selenium\\chromedriver.exe");
    System.setProperty("webdriver.chrome.bin", "D:\\selenium\\chrome.exe");
}

/**
 * 1. 鼠标左键点击
 * Actions action = new Actions(driver);
 * action.click();   //鼠标左键点击当前停留的位置
 * action.click(driver.findElement(By.id(“kw”))); //鼠标左键点击指定的元素对象
 * <p>
 * 2. 鼠标右键点击
 * Actions action = new Actions(driver);
 * action.contextClick();   //鼠标右键点击当前停留的位置
 * action.contextClick(driver.findElement(By.id(“kw”))); //鼠标右键点击指定的元素对象
 * <p>
 * 3. 鼠标双击
 * Actions action = new Actions(driver);
 * action.doubleClick();  //鼠标双击当前停留的位置
 * action.doubleClick(driver.findElement(By.id(“kw”)));  //鼠标双击指定的元素对象
 * <p>
 * 4. 鼠标拖拽
 * Actions action = new Actions(driver);
 * action.dragAndDrop(el1,el2);  //鼠标将el1元素拖放到el2元素的位置
 * action.dragAndDrop(el1,x,y);  //鼠标el1元素拖放到(x, y)位置,x为横坐标,y为纵坐标
 * <p>
 * 5. 鼠标悬停
 * Actions action = new Actions(driver);
 * action.clickAndHold(el);  //鼠标悬停在el元素的位置
 * <p>
 * 6. 鼠标移动
 * Actions action = new Actions(driver);
 * action.moveToElement(el);  //将鼠标移到el元素
 * action.moveToElement(el,x,y);   //将鼠标移到元素el的 (x, y) 位置
 * <p>
 * 7. 鼠标释放
 * action.release();  //释放鼠标
 */
public static void main(String[] args) {
    WebDriver driver = null;
    try {
        driver = new ChromeDriver();
        WebElement element = null;
        Actions actions = new Actions(driver);

        // 输入,点击
        // driver.get("https://www.baidu.com/");
        // element = driver.findElement(By.id("kw"));
        // actions.sendKeys(element, "yofc").click(driver.findElement(By.xpath("//*[@id=\"su\"]"))).perform();


        // form
        // driver.get("http://127.0.5.1:81/user-login.html");
        // element = driver.findElement(By.xpath("//input[@name='account']"));
        // element.sendKeys("yonghuming");
        // element = driver.findElement(By.xpath("//input[@name='password']"));
        // element.sendKeys("mima");
        // element = driver.findElement(By.className("form-condensed"));
        // element.submit();


        // update file
        // driver.get("https://imgurl.org/");
        // element = driver.findElement(By.className("layui-upload-file"));
        // element.sendKeys("D:\\selenium\\test.jpg");


        // 滑动
        // driver.get("http://www.jq22.com/yanshi20053");
        //
        // element = driver.findElement(By.id("iframe"));
        // driver.switchTo().frame(element);
        //
        // element = driver.findElement(By.className("slider"));
        // actions.dragAndDropBy(element, 100, 0).perform();


        // 执行 js
        driver.get("https://www.baidu.com/");
        JavascriptExecutor je = (JavascriptExecutor) driver;
        je.executeScript("alert('hello!')");

        // 缩放
        // je.executeScript("document.getElementsByTagName('body')[0].style.zoom=0.5");
        // 新窗口打开网页
        // je.executeScript("window.open('http://www.baidu.com')");

        Thread.sleep(3000);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (driver != null) {
            driver.close();
            driver.quit();
        }
    }
}
View Code

 

四、启动参数(chrome)

在浏览器启动时,加一些参数以实现一些功能。

static {
    System.setProperty("webdriver.chrome.driver", "D:\\selenium\\chromedriver.exe");
    System.setProperty("webdriver.chrome.bin", "D:\\selenium\\chrome.exe");
}

public static void main(String[] args) {
    WebDriver driver = null;
    try {
        ChromeOptions co = new ChromeOptions();
        co.addArguments("user-data-dir=D:\\selenium\\User Data");

        // 无窗口模式
        co.addArguments("headless");

        // co.addArguments("lang=zh_CN.UTF-8");

        // 代理
        // co.addArguments("proxy-server=http://183.143.41.69:8888");

        co.addArguments("user-agent='MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1'");

        driver = new ChromeDriver(co);

        // 浏览器窗口大小
        driver.manage().window().setSize(new Dimension(500,500));
        // driver.manage().window().maximize();


        driver.manage().deleteAllCookies();

        driver.get("https://www.baidu.com/");

        Thread.sleep(5000);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (driver != null) {
            driver.close();
            driver.quit();
        }
    }
}
View Code

 

五、JS 注入

让没有引入某些 js 的网页引入指定 js。

static {
    System.setProperty("webdriver.chrome.driver", "D:\\selenium\\chromedriver.exe");
    System.setProperty("webdriver.chrome.bin", "D:\\selenium\\chrome.exe");
}

public static void main(String[] args) {
    WebDriver driver = null;
    try {
        driver = new ChromeDriver();
        driver.get("http://127.0.0.1:8080");

        JavascriptExecutor je = ((JavascriptExecutor) driver);

        try {
            je.executeScript("alert(jQuery()==null)");
            Thread.sleep(3000);
        } catch (WebDriverException e) {
            je.executeScript("var h = document.getElementsByTagName('head')[0];"
                    + "var ns = document.createElement('script');"
                    + "ns.type = 'text/javascript';"
                    + "ns.src =  'http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js';"
                    + "h.appendChild(ns);");
        }

        Thread.sleep(1000);
        je.executeScript("alert(jQuery()==null)");

        Thread.sleep(3000);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (driver != null) {
            driver.close();
            driver.quit();
        }
    }
}
View Code

 

六、截图

可以截取网页指定区域

static {
    System.setProperty("webdriver.chrome.driver", "D:\\selenium\\chromedriver.exe");
    System.setProperty("webdriver.chrome.bin", "D:\\selenium\\chrome.exe");
}

public static void main(String[] args) {
    WebDriver driver = null;
    try {
        driver = new ChromeDriver();
        driver.get("https://www.baidu.com/");

        WebElement element = driver.findElement(By.className("index-logo-src"));

        File file = captureElement(driver, element);
        copyFile(file,new File("D:\\123.png"));

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (driver != null) {
            driver.close();
            driver.quit();
        }
    }
}

private static File captureElement(WebDriver driver, WebElement element) throws Exception {
    // 整个网页
    File screen = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);

    BufferedImage img = ImageIO.read(screen);

    // 获得元素的高度和宽度
    int width = element.getSize().getWidth();
    int height = element.getSize().getHeight();

    // 创建一个矩形使用上面的高度,和宽度
    Rectangle rect = new Rectangle(width, height);

    // 得到元素的坐标
    Point p = element.getLocation();

    // 从整个网页中截取指定元素
    BufferedImage dest = img.getSubimage(p.getX(), p.getY(), rect.width, rect.height);

    // 存为png格式
    ImageIO.write(dest, "png", screen);

    return screen;
}

private static void copyFile(File source, File dest) throws IOException {
    InputStream input = null;
    OutputStream output = null;
    try {
        input = new FileInputStream(source);
        output = new FileOutputStream(dest);
        byte[] buf = new byte[1024];
        int bytesRead;
        while ((bytesRead = input.read(buf)) != -1) {
            output.write(buf, 0, bytesRead);
        }
    } finally {
        input.close();
        output.close();
    }
}
View Code

 


https://www.cnblogs.com/wuyn/p/10057236.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!