selenium 模块让 Python 直接控制浏览器,实际点击链接,填写登录信息,几乎 就像是有一个人类用户在与页面交互。与 Requests 和 Beautiful Soup 相比,Selenium 允许你用高级得多的方式与网页交互。但因为它启动了 Web 浏览器,假如你只是想 从网络上下载一些文件,会有点慢,并且难以在后台运行。

 启动 selenium 控制的浏览器 

对于这些例子,你需要 FireFox 浏览器。它将成为你控制的浏览器。如果你还 没有 FireFox,可以从 http://getfirefox.com/免费下载它。 导入selenium的模块需要一点技巧。不是import selenium,而是要运行from selenium import webdriver之后,你可以用 selenium启动 FireFox 浏览器。在交互式环境中输入以下代码: 

>>> from selenium import webdriver 
>>> browser = webdriver.Firefox() 
>>> type(browser) 
<class 'selenium.webdriver.firefox.webdriver.WebDriver'> 
>>> browser.get('http://inventwithpython.com')

你会注意到,当 webdriver.Firefox()被调用时,FireFox 浏览器启动了。对值 webdriver.Firefox()调用 type(),揭示它具有 WebDriver 数据类型。调用 browser. get('http://inventwithpython.com')将浏览器指向 http://inventwithpython.com/。浏览器 应该看起来如图 11-7 所示。 

python 控制浏览器 手动登录账号 python自动控制浏览器_html

在页面中寻找元素 

WebDriver 对象有好几种方法,用于在页面中寻找元素。它们被分成find_element_*和 find_elements_*方法。find_element_*方法返回一个 WebElement 对象,代表页面中 匹配查询的第一个元素。find_elements_*方法返回 WebElement_*对象的列表,包含 页面中所有匹配的元素。 表 11-3 展示了 find_element_*和 find_elements_*方法的几个例子,它们在变量 browser 中保存的 WebDriver 对象上调用。 

python 控制浏览器 手动登录账号 python自动控制浏览器_python_02

除了*_by_tag_name()方法,所有方法的参数都是区分大小写的。如果页面上没 有元素匹配该方法要查找的元素,selenium 模块就会抛出 NoSuchElement 异常。如 果你不希望这个异常让程序崩溃,就在代码中添加 try 和 except 语句。 一旦有了 WebElement 对象,就可以读取表 11-4 中的属性,或调用其中的方法, 了解它的更多功能。 

python 控制浏览器 手动登录账号 python自动控制浏览器_字段_03

例如,打开一个新的文件编辑器,输入以下程序: 

from selenium import webdriver

browser = webdriver.Firefox()
browser.get('http://inventwithpython.com')
try:
	elem = browser.find_element_by_class_name('bookcover')
	print('Found <%s> element with that class name!' % (elem.tag_name))
except:
	print('Was not able to find an element with that name.')

这里我们打开 FireFox,让它指向一个 URL。在这个页面上,我们试图找到带 有类名'bookcover'的元素。如果找到这样的元素,我们就用 tag_name 属性将它的标 签名打印出来。如果没有找到这样的元素,就打印不同的信息。 这个程序的输出如下: 

Found <img> element with that class name!

我们发现了一个元素带有类名'bookcover',它的标签名是'img'。 
 

点击页面 

find_element_*和 find_elements_*方法返回的 WebElement 对象有一个 click()方法, 模拟鼠标在该元素上点击。这个方法可以用于链接跳转,选择单选按钮,点击提交按钮, 或者触发该元素被鼠标点击时发生的任何事情。例如,在交互式环境中输入以下代码: 

>>> from selenium import webdriver 
>>> browser = webdriver.Firefox() 
>>> browser.get('http://inventwithpython.com') 
>>> linkElem = browser.find_element_by_link_text('Read It Online') 
>>> type(linkElem) 
<class 'selenium.webdriver.remote.webelement.WebElement'> 
>>> linkElem.click()     # follows the "Read It Online" link

这段程序打开 FireFox,指向 http://inventwithpython.com/,取得<a>元素的 WebElement 对象,它的文本是“Read It Online”,然后模拟点击这个元素。就像你 自己点击这个链接一样,浏览器将跳转到这个链接。 
 

填写并提交表单 

向 Web 页面的文本字段发送击键,只要找到那个文本字段的<input>或<textarea>元 素,然后调用 send_keys()方法。例如,在交互式环境中输入以下代码: 
 

>>> from selenium import webdriver 
>>> browser = webdriver.Firefox() 
>>> browser.get('http://gmail.com') 
>>> emailElem = browser.find_element_by_id('Email') 
>>> emailElem.send_keys('not_my_real_email@gmail.com') 
>>> passwordElem = browser.find_element_by_id('Passwd') 
>>> passwordElem.send_keys('12345') 
>>> passwordElem.submit()

上面的 代码会用提供的文本填写这些文本字段(你总是可以用浏览器的开发者工具验证 id)。在任何元素上调用 submit()方法,都等同于点击该元素所在表单的 Submit 按钮(你 可以很容易地调用 emailElem.submit(),代码所做的事情一样)。 

发送特殊键 

selenium 有一个模块,针对不能用字符串值输入的键盘击键。它的功能非常类 似于转义字符。这些值保存在 selenium.webdriver.common.keys 模块的属性中。由于 这个模块名非常长,所以在程序顶部运行 from selenium.webdriver. common.keys import Keys 就比较容易。如果这么做,原来需要写 from selenium. webdriver.common.keys 的 地方,就只要写 Keys。表 11-5列出了常用的 Keys 变量。 

python 控制浏览器 手动登录账号 python自动控制浏览器_python_04

例如,如果光标当前不在文本字段中,按下 home 和 end 键,将使浏览器滚动 到页面的顶部或底部。在交互式环境中输入以下代码,注意 send_keys()调用是如何 滚动页面的: 

>>> from selenium import webdriver 
>>> from selenium.webdriver.common.keys import Keys 
>>> browser = webdriver.Firefox() 
>>> browser.get('http://nostarch.com') 
>>> htmlElem = browser.find_element_by_tag_name('html') 
>>> htmlElem.send_keys(Keys.END)  # scrolls to bottom 
>>> htmlElem.send_keys(Keys.HOME)  # scrolls to top

<html>标签是 HTML文件中的基本标签:HTML文件的完整内容包含在<html> 和</html>标签之内。调用 browser.find_element_by_tag_name('html')是像一般 Web 页 面发送按键的好地方。当你滚动到该页的底部,新的内容就会加载,这可能会有用。
 

点击浏览器按钮

 利用以下的方法,selenium 也可以模拟点击各种浏览器按钮:

browser.back()点击“返回”按钮。 

browser.forward()点击“前进”按钮。

browser.refresh()点击“刷新”按钮。

browser.quit()点击“关闭窗口”按钮。 

关于 selenium 的更多信息 

selenium 能做的事远远超出了这里描述的功能。它可以修改浏览器的 cookie, 截取页面快照,运行定制的 JavaScript。要了解这些功能的更多信息,请参考文档: http://selenium-python.readthedocs.org/。