1、引入相关maven依赖
这里我的springboot的版本为2.2.0.RELEASE(这里使用springboot开发的,不是的话用main方法跑也一样的,springboot的话只是为了方便后期存数据到数据库)
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.8.1</version>
</dependency>
2、下载相关浏览器驱动这是介绍Chrome和Edge浏览器
chrome浏览器的下载地址:https://chromedriver.storage.googleapis.com/index.html Edge的驱动下载地址为:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ !!!!!下载驱动之前检查自己浏览器的版本号为多少,下载对应版本的驱动,不然会导致程序无法调用浏览器
3、调用浏览器(以下代码均可以直接在你的main方法中直接运行)
System.setProperty("webdriver.chrome.driver", "C:\\Users\\Administrator\\Desktop\\chromedriver.exe");
ChromeDriver chromeDriver = new ChromeDriver();
chromeDriver.get("www.baidu.com");
4、常见操作(后续我遇到之后也会继续更新)
4.1 获取网页元素的方法
WebElement body= chromeDriver.findElement(By.tagName("body"));
List<WebElement> divs = body.findElements(By.tagName("div"));
4.2 执行网页的js代码并取到js的返回值
Long totalHeight = (Long) chromeDriver.executeScript("return document.body.scrollHeight")
chromeDriver.executeScript("window.scrollTo(0,100)");
4.3 鼠标移动到某一元素,并点击(一些简单的模拟登录就会需要这个操作)
WebElement loginButton= chromeDriver.findElement(By.id("login_id"));
Actions actions = new Actions(webDriver);
actions.moveToElement(loginButton).click().perform();
4.4 滚动页面,在解决滚动加载时是个好办法
Long totalHeight = (Long) chromeDriver.executeScript("return document.body.scrollHeight");
chromeDriver.executeScript("window.scrollTo(0," + totalHeight + ")");
5、常见的坑!!!!!!
5.1 网页没有加载完获取元素时会失败
当元素加载未完成的时候,html并没有当前的元素节点,获取不到就是报错(这样我感觉很奇怪,但没办法人家就是这么设计的) 解决办法:
5.1.1 在chromeDriver.get(“www.baidu.com”)方法执行完之后,线程休眠一段时间,等他加载完,但是这样就显得很不智能,不过确实是一个办法
Thread.sleep(2000);
5.1.2 全局生效,每次获取元素的时候都会等5秒(根据你自己需要设置),一旦元素出现就会继续执行下去。只需要设置一次就行了,driver实例被关闭后也就消失。
这种方式程序只会等到页面加载完了(浏览器上那个小圈圈不转了)才会去执行下面代码,如果有时候页面大部分元素都加载完了,只有极个别元素,这样就很浪费时间
chromeDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
5.1.4 指定某个元素出现再去执行操作
WebDriverWait wait = new WebDriverWait(webDriver, 10);
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.id("body")));
5.2 有些元素在iframe标签下面,导致获取不到
使用代码,将chromeDriver切换到iframe里面 有些网页可能有多层的iframe这时就需要进行一层一层的切进去,但是切出来只需要一下就好
5.2.1 如果iframe标签有name或者id的话
chromeDriver.switchTo().frame("");
5.2.2 iframe当作一个元素进行切换
WebElement iframe = driver.findElement(By.tagName("iframe"));
chromeDriver.switchTo().frame(iframe);
5.2.3切出iframe
chromeDriver.switchTo().defaultContent();
5.3 解决一些selenium识别的反爬
5.3.1 禁用启用Blink运行时的功能
window.navigator.webdriver的值设置为false
options.addArguments("--disable-blink-features=AutomationControlled");
chromeDriver.executeScript("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})", "");
|