[Python爬虫] Selenium实现自己主动登录163邮箱和Locating Elements介绍
希望该篇基础性文章对你有所帮助。假设有错误或不足之处,请海涵~
[Python爬虫]
在Windows下安装PhantomJS和CasperJS及入门介绍(上)
[Python爬虫]
在Windows下安装PIP+Phantomjs+Selenium
[Python爬虫] Selenium自己主动訪问Firefox和Chrome并实现搜索截图
注意:好像訪问浏览器在C盘会自己主动生成文件越来越小,但能够清理,不知道为啥?
一. Selenium自己主动登录
代码例如以下所看到的:
from selenium import webdriver from selenium.webdriver.common.keys import Keys import time #模拟登陆163邮箱 driver = webdriver.Firefox() driver.get("http://mail.163.com/") #username password elem_user = driver.find_element_by_name("username") elem_user.send_keys("15201615157") elem_pwd = driver.find_element_by_name("password") elem_pwd.send_keys("********") elem_pwd.send_keys(Keys.RETURN) time.sleep(5) assert "baidu" in driver.title driver.close() driver.quit()执行结果例如以下图所看到的,自己主动打开Firefox浏览器并输入username和password实现邮箱登录。
该断言结果是不存在的,主要是用于防止关闭浏览器。
同一时候输入username或password错误会提示,事实上就是浏览器。
原理解释
两年前在学习C#网络编程时,我成写过Winform自己主动訪问163邮箱的文章:
C# 网络编程之网页自己主动登录 (一).使用WebBrower控件模仿登录
通过对照。Python简短高效的优势就显示出来的,当中163邮箱登录界面HTML源代码也没有改动和修复过,这是我意料之外的。
当中通过查找该登录页面发现usernameId为“idInput”,passwordId为“pwdInput”,登录buttonID为“loginBtn”。如图id和name:
<input class="" tabindex="1" title="请输入帐号" id="idInput" name="username" type="text" value=""..
<input class="" tabindex="2" title="请输入password"
id="pwdInput" name="password" type="password" />
<button id="loginBtn" class="" type="submit">登 录</button>
例如以下图所看到的一目了然:
相同以下这段代码可实现自己主动登录CSDN,是不是能够通过它实现暴力破解password呢?
from selenium import webdriver from selenium.webdriver.common.keys import Keys import time driver = webdriver.Firefox() driver.get("https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn") elem_user = driver.find_element_by_name("username") elem_user.send_keys("Eastmount") elem_pwd = driver.find_element_by_name("password") elem_pwd.send_keys("********") elem_pwd.send_keys(Keys.RETURN) time.sleep(5) assert "baidu" in driver.title driver.close() 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。使用方法演示样例:
from selenium.webdriver.common.by import By driver.find_element(By.XPATH, '//button[text()="Some text"]') driver.find_elements(By.XPATH, '//button')这些都是通过类可获取的属性:
ID = "id" XPATH = "xpath" LINK_TEXT = "link text" PARTIAL_LINK_TEXT = "partial link text" NAME = "name" TAG_NAME = "tag name" CLASS_NAME = "class name" CSS_SELECTOR = "css selector"
1 Locating By Id
当你知道一个元素的id属性时使用该功能。
有了这种方法,用id属性值匹配时第一个被定位的元素将被返回。假设没有元素匹配id值,一个NoSuchElementException异常将会抛出。比如,參考这个页面源代码:
<html> <body> <form id="loginForm"> <input name="username" type="text" /> <input name="password" type="password" /> <input name="continue" type="submit" value="Login" /> </form> </body> <html>表单form元素能够被例如以下方式定位:
login_form = driver.find_element_by_id('loginForm')
2 Locating By Name
当你知道一个元素的name属性时使用该方法。通过该方法。第一个满足name属性值的元素将被匹配返回,假设没有元素匹配,将抛出一个NoSuchElementException异常。比如。參考以下源代码:
<html> <body> <form id="loginForm"> <input name="username" type="text" /> <input name="password" type="password" /> <input name="continue" type="submit" value="Login" /> <input name="continue" type="button" value="Clear" /> </form> </body> <html>定位username&password元素方法例如以下:
username = driver.find_element_by_name('username') password = driver.find_element_by_name('password')在"Clear"button之前会给出"Login"登录button:
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属性(理想的父元素)。你才干够依据之间的关系定位到你追踪的元素。这是不太可能改变的,而且会使你的測试更加的健壮。比如參考以下这段源码:
当中使用XPath的一个主要原因是:当你没有一个合适的ID或Name属性来定位你须要查找的元素时,你能够使用XPath去定位这个绝对元素(不建议这样),或者相对一个有id或name属性的元素定位。XPath定位器也能够通过其它不止是id和name属性进行指定元素。
绝对XPath包括定位的全部元素。这些元素从根(HTML)到其结果可能会失败,仅仅有略微调整到应用程序。通过找到附近的一个元素的id或name属性(理想的父元素)。你才干够依据之间的关系定位到你追踪的元素。这是不太可能改变的,而且会使你的測试更加的健壮。比如參考以下这段源码:
<html> <body> <form id="loginForm"> <input name="username" type="text" /> <input name="password" type="password" /> <input name="continue" type="submit" value="Login" /> <input name="continue" type="button" value="Clear" /> </form> </body> <html>这个表单form元素可能通过例如以下方法被定位:
login_form = driver.find_element_by_xpath("/html/body/form[1]") login_form = driver.find_element_by_xpath("//form[1]") login_form = driver.find_element_by_xpath("//form[@id='loginForm']")[1] 绝对路径(假设HTML有略微的修改,就会被破坏)
[2] 在HTML中的第一个表单元素
[3] 指定属性名称为id且值为loginForm的表单元素
定位username元素的方法例如以下:
username = driver.find_element_by_xpath("//form[input/@name='username']") username = driver.find_element_by_xpath("//form[@id='loginForm']/input[1]") username = driver.find_element_by_xpath("//input[@name='username']")[1] 第一个form元素通过一个input子元素。name属性和值为username实现
[2] 通过id=loginForm值的form元素找到第一个input子元素
[3] 属性名为name且值为username的第一个input元素
定位"Clear"button元素的方法例如以下:
clear_button = driver.find_element_by_xpath("//input[@name='continue'][@type='button']") clear_button = driver.find_element_by_xpath("//form[@id='loginForm']/input[4]")[1] 属性名为name其值为continue和属性名为type其值为button的Input控件
[2] 属性id=loginForm的form元素的第四个input子元素
上面这些样例涉及一些基础知识,很多其它详情请參考以下的建议:
- W3Schools XPath Tutorial
- W3C XPath Recommendation
- XPath Tutorial - with interactive examples.
- 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> <body> <p>Are you sure you want to do this?这个continue.html链接定位的方法例如以下,partial表示部分匹配:</p> <a href="continue.html">Continue</a> <a href="cancel.html">Cancel</a> </body> <html>
continue_link = driver.find_element_by_link_text('Continue') continue_link = driver.find_element_by_partial_link_text('Conti')
5 Locating Elements By Tag Name
当你想通过tag name(标记名)定位一个元素时能够使用该方法。相同,第一个给出的tag name元素将被返回。假设没有匹配的标记名,将抛出一个NoSuchElementException异常。演示样例的源码例如以下:
<html> <body> <h1>Welcome</h1> <p>Site content goes here.</p> </body> <html>定位heading(h1)元素的方法例如以下:
heading1 = driver.find_element_by_tag_name('h1')
6 Locating Elements By Class Name
<html> <body> <p class="content">Site content goes here.</p> </body> <html>当中元素"p"的定位方法例如以下:
content = driver.find_element_by_class_name('content')
7 Locating Elements By CSS Selectors
当你想要通过CSS选择器语法定位一个元素时。能够使用该方法。它将返回第一个与CSS选择器匹配的元素。假设没有匹配CSS选择器的元素,将返回一个NoSuchElementException异常。实例源码例如以下所看到的:
<html> <body> <p class="content">Site content goes here.</p> </body> <html>当中元素"p"的定位方法例如以下:
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/)