zoukankan      html  css  js  c++  java
  • selenium 入门(Java)

    官网: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_USERSoftwareMicrosoftWindowsCurrentVersionInternet Settingsones(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

  • 相关阅读:
    JavaScript模态对话框类
    事件模块的演变(1)
    html5中可通过document.head获取head元素
    How to search for just a specific file type in Visual Studio code?
    What do 'lazy' and 'greedy' mean in the context of regular expressions?
    正则非获取匹配 Lookahead and Lookbehind ZeroLength Assertions
    regex length 正则长度问题
    Inversion of Control vs Dependency Injection
    How to return View with QueryString in ASP.NET MVC 2?
    今天才发现Google Reader
  • 原文地址:https://www.cnblogs.com/jhxxb/p/11238737.html
Copyright © 2011-2022 走看看