公司需要,已经写好了抓取数据的程序,可惜因为是IE8中才能登陆,目前流行的抓数据技术在IE8中执行会出现js错误。而想正常抓数据必须要登陆后获取sessionid,手工的话比较麻烦,而且一旦登陆过期程序会自动退出,这时就像人工重新登陆,获取新的sessionid,重新启动程序。为了在抛出sessionid失效异常的时候实现自动重新登录获取新的sessionid,继续抓取数据,打算使用selenium实现自动登录等。
1: 首先在pom中引入依赖:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.6.0</version>
</dependency>
2:配置 IEDriverServer.exe
找到相应版本的浏览器内核驱动,这里以IE为例,把IEDriverServer.exe放在windows/system32目录下,执行API是会自动到这里查找,无需多余配置。如果想放到其他目录,则要在使用selenium类之前设置系统属性:
System.setProperty("webdriver.ie.driver","C:\\Utils\\IDDriverServer.exe");
3:打开IE,设置-》兼容性视图设置,把要访问的网址添加进去。然后点击 设置-》Internet选项-》安全 这里有四个大的选项,安全级别分别选择 高,高,中,高。 都勾选启用保护模式,点击应用,确定。
4:编码实现登录
以下两行代码打开百度首页,当然这只是个例子,我打开的是第三方网站的登录界面。
WebDriver driver = new InternetExplorerDriver();
driver.get("http:www.baidu.com");
获取js执行对象:
JavascriptExecutor js = (JavascriptExecutor) driver;
通过iframe 的name切换frame:
driver.switchTo().frame("myframe");
从子iframe切换到父页面:
driver.switchTo().defaultContent();
分析页面元素,找到对应的用户名和密码的输入框id:
js.executeScript("var name=document.getElementById('username');name.value='用户名'");
js.executeScript("var pwd=document.getElementById('password');pwd.value='密码'");
动态设置用户名和密码,点击登录按钮:
WebElement login=driver.findElement(By.id("login"));
//点击登录按钮
login.click();
//登录可能需要花费一定的时间,可以设置等待时间或者睡眠
new WebDriverWait(driver, 10);
Thread.sleep(9000);
此时通过以下代码可以获取登录界面html:
driver.getPageSource();
5: 实现元素快速查找
这里主要使用xpath技术查找,只给个样例,具体xpath语法自行百度。
查找tr中的td内容是 卫生服务 的td元素。
WebElement service=driver.findElement(By.xpath("//tr[td='卫生服务']"));