使用Selenium对新浪微博模拟登录
1. Selenium的配置
1.1. 在项目中引入Selenium库
通过Maven加入。
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.4.0</version>
</dependency>
1.2. 下载chromedriver.exe
1.3. 在项目代码中加入chromedriver位置的配置
System.getProperties().setProperty("webdriver.chrome.driver", "chromedriver.exe");
2. 使用Selenium
2.1. Selenim语法
Selenium的语法和一些相关资料可以看这个博客,需要用哪里直接去查阅即可。
2.2. 智能等待
首先阅读这篇java selenium (十三) 智能等待页面加载完成
由于Java8的lambda表达式可以用于显示等待,以及我个人模拟登陆过程中的一些心得,我这里补充一点内容。sleep()方法和pageLoad方法我就不再介绍,因为不推荐使用。
2.2.1. 隐式等待
最常用的等待方式,也比较简单,是全局的。
webDriver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);
在设定的时间内Selenium会尝试获取所要求的元素,很简单,对于简单的查找元素等已经足够。但是如果需要监测一些元素的状态,那还需要调用显示等待的方法。
2.2.2. 显式等待
显示等待方法需要构造一个WebDriverWait对象,其接收webDriver和设定时长(单位秒)作为构造器参数构造。
当需要等待时,则调用它的until方法,until方法接收一个ExceptedCondition<>类对象,这是一个函数对象,因此,我们可以用Java8的lambda表达式去构建。
这里举例:
webDriverWait.until((ExpectedCondition<WebElement>) w -> w.findElement(By.xpath("//div[@class='home-sub-nav layout-box']/a[4]"))).click();
webDriverWait.until((ExpectedCondition<WebElement>) w -> w.findElement(By.xpath("//div[@class='card card2 line-around']/div[1]/a[2]"))).click();
不过,通常情况下,ExceptedConditions类已经定义了我们需要的动作,而不需要自己再去实现这个接口,比如上面例子中的方法就可以用presenceOfElementLocated(By locator)方法去检查,当然,通常依赖隐式等待就可以了。
这里举一个必须用显示等待的例子,比如微博的登录界面,其输入框在刚开始时就存在,但不可用,我们需要检测到,当它可用时再去运行,这里就需要使用显示等待的方法:
WebDriverWait webDriverWait=new WebDriverWait(webDriver,10);
webDriverWait.until(ExpectedConditions.elementToBeClickable(By.id("loginName"))).sendKeys(args[0]);
webDriverWait.until(ExpectedConditions.elementToBeClickable(By.id("loginPassword"))).sendKeys(args[1]);
此处调用了elementToBeClickable方法,参考文章中有列出ExpectedConditions类中包含的方法,我在这里列出一下:
| 等待的条件 | ExpectedConditions方法 |
|---|---|
| 页面元素是否在页面上可用和可被单击 | elementToBeClickable(By locator) |
| 页面元素处于被选中状态 | elementToBeSelected(WebElement element) |
| 页面元素在页面中存在 | presenceOfElementLocated(By locator) |
| 在页面元素中是否包含特定的文本 | textToBePresentInElement(By locator) |
| 页面元素值 | textToBePresentInElementValue(By locator, java.lang.String text) |
| 标题 (title) | titleContains(java.lang.String title) |
利用这些方法可以很好的监测到我们要的控件是否可用。
3. 模拟登陆并获取Cookie的代码
public class WeiboLoginAndGetCookie {
public static void main(String[] args) throws Exception{
//配置ChromeDiver
System.getProperties().setProperty("webdriver.chrome.driver", "chromedriver.exe");
//开启新WebDriver进程
WebDriver webDriver = new ChromeDriver();
//全局隐式等待
webDriver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);
//设定网址
webDriver.get("https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=http%3A%2F%2Fm.weibo.cn%2F");
//显示等待控制对象
WebDriverWait webDriverWait=new WebDriverWait(webDriver,10);
//等待输入框可用后输入账号密码
webDriverWait.until(ExpectedConditions.elementToBeClickable(By.id("loginName"))).sendKeys(args[0]);
webDriverWait.until(ExpectedConditions.elementToBeClickable(By.id("loginPassword"))).sendKeys(args[1]);
//点击登录
webDriver.findElement(By.id("loginAction")).click();
//等待2秒用于页面加载,保证Cookie响应全部获取。
sleep(2000);
//获取Cookie并打印
Set<Cookie> cookies=webDriver.manage().getCookies();
Iterator iterator=cookies.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next().toString());
}
//关闭WebDriver,否则并不自动关闭
webDriver.close();
}
}
使用Selenium对新浪微博模拟登录的更多相关文章
- 4、python+selenium实现12306模拟登录
简介: 这里是利用了selenium+图片识别验证,来实现12306的模拟登录,中间也参考了好几个项目,实现了这个小demo,中间也遇到了很多的坑,主要难点在于图片识别和滑动验证这两个方面,图片识别是 ...
- 【Python3爬虫】最新的模拟登录新浪微博教程
一.写在前面 首先呢,由于之前重装系统,又要重新配置环境,然后还有一些别的事,导致我一直没有写爬虫了,不过现在又可以继续写了. 然后我这次说的模拟登录新浪微博呢,不是使用Selenium模拟浏览器操作 ...
- curl模拟登录新浪微博
这几天要做个获取新浪微博@我的信息, 又不用第三方登录,所以只能通过模拟登录来获取信息,研究的一下发现直接模拟登录微博比较困难,验证的算法比较复杂,于是绕道通过登录新浪通行证后来获取cookie 来 ...
- 【python网络编程】使用rsa加密算法模块模拟登录新浪微博
一.基础知识 http://blog.csdn.net/pi9nc/article/details/9734437 二.模拟登录 因为上学期参加了一个大数据比赛,需要抓取数据,所以就想着写个爬虫抓取新 ...
- Cookies与保持登录(新浪微博的简单模拟登录)
Cookies与保持登录(新浪微博的简单登录) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino ...
- 测试开发Python培训:模拟登录新浪微博-技术篇
测试开发Python培训:模拟登录新浪微博-技术篇 一般一个初学者项目的起点就是登陆功能的自动化,而面临的项目不同实现的技术难度是不一样的,poptest在做测试开发培训中更加关注技术难点,掌握技 ...
- selenium跳过webdriver检测并模拟登录淘宝
目录 简介 编写思路 使用教程 演示图片 源代码 @(文章目录) 简介 模拟登录淘宝已经不是一件新鲜的事情了,过去我曾经使用get/post方式进行爬虫,同时也加入IP代理池进行跳过检验,但随着大型网 ...
- Java实现模拟登录新浪微博
毕设题目要使用到新浪微博数据,所以要爬取新浪微博的数据.一般而言,新浪微博的爬虫有两种模式:新浪官方API和模拟登录新浪微博.两种方法的异同点和适用情况就无须赘述了.前辈的文章已经非常多了.写这篇文章 ...
- 4 使用Selenium模拟登录csdn,取出cookie信息,再用requests.session访问个人中心(保持登录状态)
代码: # -*- coding: utf-8 -*- """ Created on Fri Jul 13 16:13:52 2018 @author: a " ...
随机推荐
- javascript之DOM编程实现城市的联动框
需求;用一张图片表示. 分析: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht ...
- 将Ext JS 5应用程序导入Web项目以及实现本地化
在Ext JS 5,使用了新的脚本和样式加载方式,这对于将应用程序导入到Web项目中产生了点小麻烦.而对于本地化文件的导入,也采用了新的方式,本文将一一解答这些问题. 将Ext JS 5应用程序导入W ...
- LCS问题(最长公共子序列)-动态规划实现
问题描述: 问题] 求两字符序列的最长公共字符子序列 注意: 并不要求子串(字符串一)的字符必须连续出现在字符串二中. 思路分析: 最优子结构和重叠子问题的性质都具有,所以要采取动态规划的算法 最长公 ...
- AngularJS进阶(三十五)浏览器兼容性解决之道
浏览器兼容性解决之道 前言 浏览器兼容性一直是前端开发中不得不面对的一个问题.而最突出的就是IE.对绝大多数公司来说,兼容IE6的性价比已经很低,而IE7则几乎已经绝迹.所以,常见的兼容性下限是IE8 ...
- Rust语言之HelloWorld Web版
Rust语言之HelloWorld Web版 下面这篇文章值得仔细研读: http://arthurtw.github.io/2014/12/21/rust-anti-sloppy-programmi ...
- python 去掉 pyc
python 去掉 .pyc 在开发的机器上(Ubuntu),python自动生成的pyc文件太影响心情,把下面的语句添加到 /etc/profile中: # do not produce .pyc ...
- 聊聊javaMail
今天闲着无事 看了看用java发送邮件的相关知识 代码参考自<<精通Java Web整合开发(JSP+AJAX+Struts+Hibernate)>>(第2版) 不多说 先上图 ...
- 《java入门第一季》之面向对象
之前的代码描述都是基于面向过程的,今天开始正式进入面向对象的世界.什么是对象?首先要区分类和对象的概念-- 现实世界中是如何描述一个事物的? 举例:学生 姓名,年龄,性别... 学习,吃饭,睡觉 属性 ...
- Java 条形码生成(一维条形码)
utl:http://mianhuaman.iteye.com/blog/1013945 在这里给大家介绍一个java 生成条形码 jbarcode.jar 生成条形码 支持EAN13, EAN8, ...
- Android ROM开发(二)——ROM架构以及Updater-Script脚本分析,常见的Status错误解决办法
Android ROM开发(二)--ROM架构以及Updater-Script脚本分析,常见的Status错误解决办法 怪自己二了,写好的不小心弄没了,现在只好重新写一些了,上篇简单的配置了一下环境, ...