使用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的语法和一些相关资料可以看这个博客,需要用哪里直接去查阅即可。

java selenium (一) 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();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,719评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,337评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,887评论 0 324
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,488评论 1 266
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,313评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,284评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,672评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,346评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,644评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,700评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,457评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,316评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,706评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,261评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,648评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,859评论 2 335

推荐阅读更多精彩内容