天天看点

[Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍

        前三篇文章介绍了安装过程和通过selenium实现访问firefox浏览器并自动搜索"eastmount"关键字及截图的功能。而这篇文章主要简单介绍如何实现自动登录163邮箱,同时继续介绍selenium+python官网locating elements部分内容。

        希望该篇基础性文章对你有所帮助,如果有错误或不足之处,请海涵~

        注意:好像访问浏览器在c盘会自动生成文件越来越小,但可以清理,不知道为啥?

        代码如下所示:

        运行结果如下图所示,自动打开firefox浏览器并输入用户名和密码实现邮箱登录。

[Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍

        代码非常简单,其中的原理也很简单:通过driver访问firefox浏览器及url,同时find_element_by_name找到网页html源代码中对应的值并填充,最后调用keys实现模拟操作键盘keys.return实现。该断言结果是不存在的,主要是用于防止关闭浏览器。

        同时输入用户名或密码错误会提示,其实就是浏览器。

[Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍

原理解释 

        两年前在学习c#网络编程时,我成写过winform自动访问163邮箱的文章:

        通过对比,python简短高效的优势就显示出来的,其中163邮箱登录界面html源码也没有修改和修复过,这是我意料之外的。

        其中通过查找该登录页面发现用户名id为“idinput”,密码id为“pwdinput”,登录按钮id为“loginbtn”。如图id和name:

          <input class="" tabindex="1" title="请输入帐号" id="idinput" name="username" type="text" value=""..

          <input class="" tabindex="2" title="请输入密码"

id="pwdinput" name="password" type="password" />

          <button id="loginbtn" class="" type="submit">登  录</button>

        如下图所示一目了然:

[Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍

        这部分文章虽然简单,但是作为基础文章在合适不过了,同时通过webdriver的driver.find_element_by_name引出下面的基础知识介绍,毕竟实践例子才是学习selenium的动力源泉。

        同样下面这段代码可实现自动登录csdn,是不是可以通过它实现暴力破解密码呢?

        ps:第一次上传翻译博文,如果有错误还请见谅!

        这里有各种策略用于定位网页中的元素(locate elements),你可以选择最适合的方案,selenium提供了一下方法来定义一个页面中的元素:

find_element_by_id

find_element_by_name

find_element_by_xpath

find_element_by_link_text

find_element_by_partial_link_text

find_element_by_tag_name

find_element_by_class_name

find_element_by_css_selector

        下面是查找多个元素(这些方法将返回一个列表):

find_elements_by_name

find_elements_by_xpath

find_elements_by_link_text

find_elements_by_partial_link_text

find_elements_by_tag_name

find_elements_by_class_name

find_elements_by_css_selector

        除了上面给出的公共方法,这里也有两个在页面对象定位器有用的私有方法。这两个私有方法是find_element和find_elements,用法示例:

       这些都是通过类可获取的属性:

       当你知道一个元素的id属性时使用该功能。有了这个方法,用id属性值匹配时第一个被定位的元素将被返回。如果没有元素匹配id值,一个nosuchelementexception异常将会抛出。例如,参考这个页面源码:

        表单form元素可以被如下方式定位:

        当你知道一个元素的name属性时使用该方法。通过该方法,第一个满足name属性值的元素将被匹配返回,如果没有元素匹配,将抛出一个nosuchelementexception异常。例如,参考下面源码:

        定位username&password元素方法如下:

        在"clear"按钮之前会给出"login"登录按钮:

        这个表单form元素可能通过如下方法被定位:

        [1] 绝对路径(如果html有稍微的改动,就会被破坏)

        [2] 在html中的第一个表单元素

        [3] 指定属性名称为id且值为loginform的表单元素

        定位username元素的方法如下:

        [1] 第一个form元素通过一个input子元素,name属性和值为username实现

        [2] 通过id=loginform值的form元素找到第一个input子元素

        [3] 属性名为name且值为username的第一个input元素

         定位"clear"按钮元素的方法如下:

        [1] 属性名为name其值为continue和属性名为type其值为button的input控件

        [2] 属性id=loginform的form元素的第四个input子元素

        上面这些例子涉及一些基础知识,更多详情请参考下面的建议:

<a target="_blank" href="http://www.w3schools.com/xpath/">w3schools xpath tutorial</a>

<a target="_blank" href="http://www.w3.org/tr/xpath">w3c xpath recommendation</a>

        这里也有几个非常实用的附加组件,可以帮助发现元素的xpath:

xpath suggestions are just one of the many powerful features of this very useful add-on.

        当你知道一个锚标记内使用链接文本就使用该方法。通过这个策略,第一个匹配这个link text值的元素将被返回。如果没有元素匹配这个链接文本,将抛出一个nosuchelementexception异常。示例的源代码如下:

        这个continue.html链接定位的方法如下,partial表示部分匹配:

        当你想通过tag name(标记名)定位一个元素时可以使用该方法。同样,第一个给出的tag name元素将被返回,如果没有匹配的标记名,将抛出一个nosuchelementexception异常。示例的源代码如下:

        定位heading(h1)元素的方法如下:

        介绍类似,用于通过类属性名(class attribute name)进行定位一个元素。示例源代码如下:

        其中元素"p"的定位方法如下:

        当你想要通过css选择器语法定位一个元素时,可以使用该方法。它将返回第一个与css选择器匹配的元素,如果没有匹配css选择器的元素,将返回一个nosuchelementexception异常。实例源代码如下所示:

        sauce实验室有非常好的关于css选择器的文档: