本帖最后由 草帽路飞UU 于 2019-1-29 16:39 编辑
一、简介WebDriver官方对其描述如下:
Webdriver (Selenium2)是一种用于Web应用程序的自动测试工具,它提供了一套友好的API,Webdriver完全就是一套类库,不依赖于任何测试框架,除了必要的浏览器驱动,不需要启动其他进程或安装其他程序,也不必像Selenium 1那样需要先启动服务。 Selenium 2则是通过原生浏览器支持或者浏览器扩展直接控制浏览器。
个人理解WebDriver作为自动化测试工具,可以直接通过浏览器对页面按照之前设置的程序进行操作,因为是完完全全原生浏览器的操作,所以我们人工可以完成的工作原则上WebDriver都可以帮助我们完成,这就是他强大的地方。 本文介绍如何搭建开发环境,以及我爬取的过程中常用的功能,具体的语法请关注Selenium2的中文教程网
二、搭建开发环境 WebDriver支持多种语言调用API,并且支持多种浏览器。这里我们就选择Java 注意的是,这里我们指的是Webdriver (Selenium2) Webdriver (Selenium3)搭建开发环境会有不同。 WebDriver搭建需要三个东西配合 selenium的开发包 浏览器驱动 浏览器 这里最最最最最坑的是:这三个东西的版本必须相互匹配!!!!! 因为我一开始搭建的时候就是因为版本问题死活跑不起来,后来在高人的指点下,才终于找到一个都匹配的版本。 所以大家没有特殊需求建议搭建过程严格使用我这三个版本
2.1selenium的开发包 这里我们使用Maven的方式搭建,注意,我们选择的是Selenium2的版本 - <dependency>
- <groupId>org.seleniumhq.selenium</groupId>
- <artifactId>selenium-java</artifactId>
- <version>2.53.1</version>
- </dependency>
复制代码
2.2浏览器驱动 Selenium2对于火狐浏览器是不需要驱动的,如果使用谷歌等浏览器就需要下载对应版本的驱动。 但是注意Selenium3对于火狐也是需要驱动的。 并且使用火狐会出现某些元素点击不了的BUG,所以在此建议使用谷歌浏览器 这里我们的驱动也使用谷歌浏览器 在代码中这样设置驱动 System.setProperty("webdriver.chrome.driver","D:\\work\\Webdriver\\chromedriver_x64.exe");
2.3浏览器版本 配合驱动的版本,浏览器只需要升级到最新版本就可以 我这里使用的是Google Chrome 版本 61.0.3163.100(正式版本) 如果你的浏览器不是安装在默认路径下,你还需要设置一下浏览器的路径 - System.setProperty("webdriver.chrome.bin", "C:\\Program Files (x86)\\Chrome\\chrome.bin");
复制代码
这样我们就搭建完成了开发环境,我们简单跑一个测试应用
我们让程序自动打开浏览器,然后百度Java - System.setProperty("webdriver.chrome.driver","D:\\work\\Webdriver\\chromedriver_x64.exe");
- WebDriver webDriver = new ChromeDriver();
- webDriver.get("http://www.baidu.com");
- webDriver.findElement(By.id("kw")).sendKeys("Java");
- webDriver.findElement(By.id("su")).click();
- try {
- Thread.sleep(3000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- webDriver.quit();
复制代码
三、定位元素 在操作页面的时候,首先要做的就是定位页面上元素的位置。 定位的方式有很多,这里重点介绍3种 id className xpath 1.首先使用id是最准确的,速度也是最快的 2.使用className定位不一定准备,因为搜索到可能不止一个元素 3.xpath是辅助定位的利器,使用谷歌等浏览器非常方便的能获得元素的Xpath
在开发工具中像这样找到了这个元素之后,右键-copy-xpath就能获得该元素的xpath://*[@id=”kw”] - Element element = webDriver.findElement(By.id(key));
- Element element = webDriver.findElement(By.className(key));
- Element element = webDriver.findElement(By.xpath(key));
复制代码 四、模拟点击模拟点击主要有两种方式:WebDriver提供的API,JS方法操作,同时鼠标悬停等操作同理。
4.1调用API点击- WebElement element = driver.findElement(By.linkText("登录"));
- Actions builder = new Actions(driver);
- Action mouserOverlogin=builder.moveToElement(element).click().build();
- mouserOverlogin.perform();
复制代码
首先先找到元素,然后封装一个动作,然后使用perform把这个动作释放。
或者可以这样简单写:
- webDriver.findElement(By.id("su")).click();
复制代码
4.2使用JS点击有时候使用API在网络状态不好的时候会比较慢,所以使用JS方法模拟点击会更加有效。
WebDriver对象可以转化为一个JS对象,然后使用JS的方法去执行点击操作 - JavascriptExecutor javascriptExecutor = (JavascriptExecutor)webDriver;
- javascriptExecutor.executeScript("document.getElementById('next-page-top').click();");
复制代码 4.3智能等待有时候我们想点击某个按钮,但是还没有加载出来我们就去点击会报错。
所以我们就需要等待这个按钮出现再点击。
一种比较笨的办法就是sleep一段时间,但是这种方法不具备通用性。
这里我们就需要使用WebDriver的智能等待了 - WebDriverWait wait = new WebDriverWait(webDriver, 10);
- wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("results-per-page-select")));//设置等待
复制代码
|