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

目录(?)[+]

前三篇文章介绍了安装过程和通过Selenium实现访问Firefox浏览器并自动搜索"Eastmount"关键字及截图的功能。而这篇文章主要简单介绍如何实现自动登录163邮箱,同时继续介绍Selenium+Python官网Locating Elements部分内容。
        希望该篇基础性文章对你有所帮助,如果有错误或不足之处,请海涵~
        [Python爬虫] 在Windows下安装PhantomJS和CasperJS及入门介绍(上)
        [Python爬虫] 在Windows下安装PIP+Phantomjs+Selenium
        [Python爬虫] Selenium自动访问Firefox和Chrome并实现搜索截图
        注意:好像访问浏览器在C盘会自动生成文件越来越小,但可以清理,不知道为啥?

一. Selenium自动登录

代码如下所示:

[python] view plain copy

  1. from selenium import webdriver
  2. from selenium.webdriver.common.keys import Keys
  3. import time
  4. #模拟登陆163邮箱
  5. driver = webdriver.Firefox()
  6. driver.get("http://mail.163.com/")
  7. #用户名 密码
  8. elem_user = driver.find_element_by_name("username")
  9. elem_user.send_keys("15201615157")
  10. elem_pwd = driver.find_element_by_name("password")
  11. elem_pwd.send_keys("********")
  12. elem_pwd.send_keys(Keys.RETURN)
  13. time.sleep(5)
  14. assert "baidu" in driver.title
  15. driver.close()
  16. driver.quit()

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

代码非常简单,其中的原理也很简单:通过driver访问Firefox浏览器及URL,同时find_element_by_name找到网页HTML源代码中对应的值并填充,最后调用Keys实现模拟操作键盘Keys.RETURN实现。该断言结果是不存在的,主要是用于防止关闭浏览器。
        同时输入用户名或密码错误会提示,其实就是浏览器。

原理解释 
        两年前在学习C#网络编程时,我成写过Winform自动访问163邮箱的文章:
        C# 网络编程之网页自动登录 (一).使用WebBrower控件模仿登录
        通过对比,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>
        如下图所示一目了然:

这部分文章虽然简单,但是作为基础文章在合适不过了,同时通过webdriver的driver.find_element_by_name引出下面的基础知识介绍,毕竟实践例子才是学习Selenium的动力源泉。
        同样下面这段代码可实现自动登录CSDN,是不是可以通过它实现暴力破解密码呢?

[python] view plain copy

  1. from selenium import webdriver
  2. from selenium.webdriver.common.keys import Keys
  3. import time
  4. driver = webdriver.Firefox()
  5. driver.get("https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn")
  6. elem_user = driver.find_element_by_name("username")
  7. elem_user.send_keys("Eastmount")
  8. elem_pwd = driver.find_element_by_name("password")
  9. elem_pwd.send_keys("********")
  10. elem_pwd.send_keys(Keys.RETURN)
  11. time.sleep(5)
  12. assert "baidu" in driver.title
  13. driver.close()
  14. driver.quit()

二. Locating Elements介绍

PS:第一次上传翻译博文,如果有错误还请见谅!
        官网地址:http://selenium-python.readthedocs.org/locating-elements.html
        这里有各种策略用于定位网页中的元素(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,用法示例:

[python] view plain copy

  1. from selenium.webdriver.common.by import By
  2. driver.find_element(By.XPATH, ‘//button[text()="Some text"]‘)
  3. driver.find_elements(By.XPATH, ‘//button‘)

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

[python] view plain copy

  1. ID = "id"
  2. XPATH = "xpath"
  3. LINK_TEXT = "link text"
  4. PARTIAL_LINK_TEXT = "partial link text"
  5. NAME = "name"
  6. TAG_NAME = "tag name"
  7. CLASS_NAME = "class name"
  8. CSS_SELECTOR = "css selector"

1 Locating By Id

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

[html] view plain copy

  1. <html>
  2. <body>
  3. <form id="loginForm">
  4. <input name="username" type="text" />
  5. <input name="password" type="password" />
  6. <input name="continue" type="submit" value="Login" />
  7. </form>
  8. </body>
  9. <html>

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

[python] view plain copy

  1. login_form = driver.find_element_by_id(‘loginForm‘)

2 Locating By Name

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

[html] view plain copy

  1. <html>
  2. <body>
  3. <form id="loginForm">
  4. <input name="username" type="text" />
  5. <input name="password" type="password" />
  6. <input name="continue" type="submit" value="Login" />
  7. <input name="continue" type="button" value="Clear" />
  8. </form>
  9. </body>
  10. <html>

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

[python] view plain copy

  1. username = driver.find_element_by_name(‘username‘)
  2. password = driver.find_element_by_name(‘password‘)

在"Clear"按钮之前会给出"Login"登录按钮:

[python] view plain copy

  1. continue = driver.find_element_by_name(‘continue‘)

3 Locating By XPath

XPath是用于定位XML文档中节点的语言。正如HTML可以是XML(XHTML)的一个实现,Selenium用户可以利用这个强大的语言来跟踪Web应用程序中的元素。XPath扩展已经超出(以及支持)了按照id或name属性定位的简单方法,并开发了各种新的可能,如定位页面上的第三个复选框(checkbox)。
        其中使用XPath的一个主要原因是:当你没有一个合适的ID或Name属性来定位你需要查找的元素时,你可以使用XPath去定位这个绝对元素(不建议这样),或者相对一个有id或name属性的元素定位。XPath定位器也可以通过其他不止是id和name属性进行指定元素。
        绝对XPath包含定位的所有元素,这些元素从根(HTML)到其结果可能会失败,只有稍微调整到应用程序。通过找到附近的一个元素的id或name属性(理想的父元素),你才可以根据之间的关系定位到你追踪的元素。这是不太可能改变的,并且会使你的测试更加的健壮。例如参考下面这段源代码:

[html] view plain copy

  1. <html>
  2. <body>
  3. <form id="loginForm">
  4. <input name="username" type="text" />
  5. <input name="password" type="password" />
  6. <input name="continue" type="submit" value="Login" />
  7. <input name="continue" type="button" value="Clear" />
  8. </form>
  9. </body>
  10. <html>

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

[python] view plain copy

  1. login_form = driver.find_element_by_xpath("/html/body/form[1]")
  2. login_form = driver.find_element_by_xpath("//form[1]")
  3. login_form = driver.find_element_by_xpath("//form[@id=‘loginForm‘]")

[1] 绝对路径(如果HTML有稍微的改动,就会被破坏)
        [2] 在HTML中的第一个表单元素
        [3] 指定属性名称为id且值为loginForm的表单元素
        定位username元素的方法如下:

[python] view plain copy

  1. username = driver.find_element_by_xpath("//form[input/@name=‘username‘]")
  2. username = driver.find_element_by_xpath("//form[@id=‘loginForm‘]/input[1]")
  3. username = driver.find_element_by_xpath("//input[@name=‘username‘]")

[1] 第一个form元素通过一个input子元素,name属性和值为username实现
        [2] 通过id=loginForm值的form元素找到第一个input子元素
        [3] 属性名为name且值为username的第一个input元素
         定位"Clear"按钮元素的方法如下:

[python] view plain copy

  1. clear_button = driver.find_element_by_xpath("//input[@name=‘continue‘][@type=‘button‘]")
  2. clear_button = driver.find_element_by_xpath("//form[@id=‘loginForm‘]/input[4]")

[1] 属性名为name其值为continue和属性名为type其值为button的Input控件
        [2] 属性id=loginForm的form元素的第四个input子元素
        上面这些例子涉及一些基础知识,更多详情请参考下面的建议:

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

  • XPath Checker - suggests XPath and can be used to test XPath results.
  • Firebug - XPath suggestions are just one of the many powerful features of this very useful add-on.
  • XPath Helper - for Google Chrome

4 Locating Hyperlinks By Link Text

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

[html] view plain copy

  1. <html>
  2. <body>
  3. <p>Are you sure you want to do this?</p>
  4. <a href="continue.html">Continue</a>
  5. <a href="cancel.html">Cancel</a>
  6. </body>
  7. <html>

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

[python] view plain copy

  1. continue_link = driver.find_element_by_link_text(‘Continue‘)
  2. continue_link = driver.find_element_by_partial_link_text(‘Conti‘)

5 Locating Elements By Tag Name

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

[html] view plain copy

  1. <html>
  2. <body>
  3. <h1>Welcome</h1>
  4. <p>Site content goes here.</p>
  5. </body>
  6. <html>

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

[python] view plain copy

  1. heading1 = driver.find_element_by_tag_name(‘h1‘)

6 Locating Elements By Class Name

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

[html] view plain copy

  1. <html>
  2. <body>
  3. <p class="content">Site content goes here.</p>
  4. </body>
  5. <html>

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

[python] view plain copy

  1. content = driver.find_element_by_class_name(‘content‘)

7 Locating Elements By CSS Selectors

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

[html] view plain copy

  1. <html>
  2. <body>
  3. <p class="content">Site content goes here.</p>
  4. </body>
  5. <html>

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

[python] view plain copy

  1. content = driver.find_element_by_css_selector(‘p.content‘)

Sauce实验室有非常好的关于CSS选择器的文档:
           Sauce Labs has good documentation on CSS selectors.

原文:(By:Eastmount 2015-8-21 下午6点   http://blog.csdn.net/eastmount/

时间: 2024-10-12 14:00:13

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

[python爬虫] Selenium常见元素定位方法和操作的学习介绍

这篇文章主要Selenium+Python自动测试或爬虫中的常见定位方法.鼠标操作.键盘操作介绍,希望该篇基础性文章对你有所帮助,如果有错误或不足之处,请海涵~ 前文目录: [Python爬虫] 在Windows下安装PhantomJS和CasperJS及入门介绍(上) [Python爬虫] 在Windows下安装PIP+Phantomjs+Selenium [Python爬虫] Selenium自动访问Firefox和Chrome并实现搜索截图 [Python爬虫] Selenium实现自动登

【webdriver自动化】使用unittest实现自动登录163邮箱然后新建一个联系人

#练习:登录163邮箱然后新建一个联系人 import unittest import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver import ActionChains from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.su

5、Selenium+Python自动登录163邮箱发送邮件

1.Selenium实现自动化,需要定位元素,以下查看163邮箱的登录元素 (1)登录(定位到登录框,登录框是一个iframe,如果没有定位到iframe,是无法定位到账号框与密码框) 定位到邮箱框(name='email') 定位到密码框(name='password') 定位到登录按钮(id="dologin") 2.代码实现 #coding=utf-8 import time from selenium import webdriver broswer = webdriver.I

[转][Python][自动登录163邮箱]

#-*- coding:UTF-8 -*-import urllib,urllib2,cookielibimport xml.etree.ElementTree as etree #xml解析类 class Login163:   #伪装browser    header = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}    us

Python爬虫,京东自动登录,在线抢购商品

京东抢购Python爬虫,自动登录京东网站,查询商品库存,价格,显示购物车详情等.可以指定抢购商品,自动购买下单,然后手动去京东付款就行. chang log2017-03-30 实现二维码扫码登陆 2017-06-27 Golang版JD_AutoBuy 运行环境Python 2.7 第三方库Requests: 简单好用,功能强大的Http请求库 beautifulsoup4: HTML文档格式化及便签选择器 环境配置 1 pip install requests 2 pip install

python webdriver 显示等待-自动登录126邮箱,添加联系人

脚本内容:#encoding=utf-8#author-夏晓旭from selenium import webdriverimport timefrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.common.by import Byfrom selenium.common.exceptions import TimeoutException, NoSuchElementExceptioni

Python 使用selenium实现自动登录博客园

需要做的准备: 本文章是使用Chrome,所以需要Chormedriver.exe,具体的下载过程可以百度查到 Selenium是一种自动化测试工具,能模拟浏览器的行为,所以今天我就模拟一下浏览器登陆博客园的行为. 首先,分析问题,登陆博客园需要做些什么: 1.打开浏览器 2.输入博客园主页的网址 3.点击登陆按钮,等待页面跳转 4.输入账号密码,点击登陆 知道了步骤,接下来我们用代码来实现它:from selenium import webdriverimport time#创建登陆类 fro

[Python爬虫] Selenium爬取新浪微博移动端热点话题及评论 (下)

这篇文章主要讲述了使用python+selenium爬取新浪微博的热点话题和评论信息.其中使用该爬虫的缺点是效率极低,傻瓜式的爬虫,不能并行执行等,但是它的优点是采用分析DOM树结构分析网页源码并进行信息爬取,同时它可以通过浏览器进行爬取中间过程的演示及验证码的输入.这篇文章对爬虫的详细过程就不再论述了,主要是提供可运行的代码和运行截图即可.希望文章对你有所帮助吧~ 参考文章 [python爬虫] Selenium爬取新浪微博内容及用户信息 [Python爬虫] Selenium爬取新浪微博客户

[Python爬虫] Selenium获取百度百科旅游景点的InfoBox消息盒

前面我讲述过如何通过BeautifulSoup获取维基百科的消息盒,同样可以通过Spider获取网站内容,最近学习了Selenium+Phantomjs后,准备利用它们获取百度百科的旅游景点消息盒(InfoBox),这也是毕业设计实体对齐和属性的对齐的语料库前期准备工作.希望文章对你有所帮助~ 源代码 1 # coding=utf-8 2 """ 3 Created on 2015-09-04 @author: Eastmount 4 """ 5