什么是selenium
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏。
这里是个有趣的解释
什么是无头浏览器
A headless browser is a web browser without a graphical user interface.
这是维基百科的解释。意思就是没有图形界面的浏览器。
Headless browsers provide automated control of a web page in an environment similar to popular web browsers, but are executed via a command-line interface or using network communication. They are particularly useful for testing web pages as they are able to render and understand HTML the same way a browser would, including styling elements such as page layout, colour, font selection and execution of JavaScript and AJAX which are usually not available when using other testing methods.
以命令行接口或者网络通信的方式驱动浏览器,主要用于网页测试。
参考这些网友的知乎回答
selenium模块基本用法
使用webdriver模块驱动phantomjs无头浏览器
1 | from selenium import webdriver |
webdriver生成截图保存到本地。
driver = webdriver.PhantomJS(r"E:\phantomjs-2.1.1-windows\phantomjs-2.1.1-windows\bin\phantomjs.exe")
这一句里面,r
的作用是去除转义影响,避免了对windows路径里面的\
作转义的麻烦。
使用webdriver模块驱动chromdriver无头浏览器
1 | from selenium import webdriver |
因为我本地下载了chromdriver,对应的版本和我电脑上chrom浏览器的版本一致,所以这个程序运行时,可以看到浏览器运行的界面和过程,像这样。
我对应下载的chromedriver下载地址
定位和操作
定位
driver.find_element_by_id("kw").send_keys("python")
这是通过id进行定位。
还可以通过xpath定位,例如:1
2
3
4
5
6from selenium import webdriver
import time
driver = webdriver.Chrome(r"E:\chromedriver_win32\chromedriver.exe") #实例化一个driver
driver.get("http://www.baidu.com") #发送请求
driver.find_element_by_xpath("//input[@class='s_ipt']").send_keys("hello")模拟输入行为
1
2
3
4
5
6
7
8from selenium import webdriver
import time
driver = webdriver.Chrome(r"E:\chromedriver_win32\chromedriver.exe") #实例化一个driver
driver.get("http://www.baidu.com") #发送请求
driver.find_element_by_id("kw").send_keys("python") #定位到id为kw的元素,输入python
time.sleep(2) #睡两秒
driver.quit() #退出浏览器driver.find_element_by_id("kw").send_keys("python")
这个意思是找到id为kw的元素,输入搜索词python
。
driver.quit()
:退出浏览器driver.close()
:退出浏览器当前页面
模拟点击行为
1
2
3
4
5
6
7
8from selenium import webdriver
import time
driver = webdriver.Chrome(r"E:\chromedriver_win32\chromedriver.exe") #实例化一个driver
driver.get("http://www.baidu.com") #发送请求
driver.find_element_by_id("kw").send_keys("python") #定位到id为kw的元素,输入python
driver.find_element_by_id("su").click() #定位到id为su的元素,做点击操作
time.sleep(2) #睡两秒获取cookie
1
2
3
4
5
6
7
8
9
10
11
12from selenium import webdriver
import time
driver = webdriver.Chrome(r"E:\chromedriver_win32\chromedriver.exe") #实例化一个driver
driver.get("http://www.baidu.com") #发送请求
driver.find_element_by_id("kw").send_keys("python") #定位到id为kw的元素,输入python
driver.find_element_by_id("su").click() #定位到id为su的元素,做点击操作
cookies = driver.get_cookies() #获取cookies
print(cookies) #打印的结果是一个列表,列表元素为字典
print("*"*100)
cookies = {i["name"]:i["value"] for i in cookies} #利用列表推导式,将列表转换为字典
print(cookies) #打印结果是一个字典,这个字典就是cookies的键值对程序运行结果:
获取页面源码
1 | from selenium import webdriver |
程序运行结果:
获取当前url
比如,我们可以获取到点击【百度一下】这个按钮时对应的url。
1 | from selenium import webdriver |
程序运行结果:
- find_element和find_elements的区别
find_element
返回一个元素,如果没有结果则报错find_elements
返回一个列表,如果没有结果则返回空列表
获取标签的文本内容,要使用.text方法。
1 | from selenium import webdriver |
程序运行结果:
by_xpath中获取属性和文本需要使用get_attribute() 和.text
1 | from selenium import webdriver |
程序运行结果:
获取文本对应的url链接
find_element_by_link_text
:文本内容全包含find_element_by_partial_link_text
:文本内容部分包含
举例:1
2
3
4
5
6
7from selenium import webdriver
import time
driver = webdriver.Chrome(r"E:\chromedriver_win32\chromedriver.exe") #实例化一个driver
driver.get("https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=python&rsv_pq=cf780276001c69b1&rsv_t=b63boxEoUd2mj3Cb6CKdi%2B%2BKLueLrf4Ba7bChU%2BVNKhUuiCvKToE2IaMhQU&rqlang=cn&rsv_enter=0&rsv_dl=tb&rsv_sug3=6&inputT=189&rsv_sug4=189") #发送请求
link = driver.find_element_by_partial_link_text("下一页").get_attribute("href")
print(link)程序运行结果:
定位iframe中的内容
直接定位iframe中的内容,程序会报错:
我们定位iframe中的内容,需要先切换到iframe。1
2
3
4
5
6
7
8from selenium import webdriver
import time
driver = webdriver.Chrome(r"E:\chromedriver_win32\chromedriver.exe") #实例化一个driver
driver.get("https://mail.qq.com/") #发送请求
# driver.switch_to.frame("login_frame") #这两种方法都可以切换到iframe
driver.switch_to_frame("login_frame") #这是根据iframe的id来定位iframe的
driver.find_element_by_id("u").send_keys("123456")注意
如果网站采用了动态html技术,那么页面上的部分元素出现时间便不能确定,这个时候就可以设置一个等待时间,强制要求在时间内出现,否则报错。
举例:
代码:1
2
3
4
5
6
7
8
9
10
11from selenium import webdriver
import time
driver = webdriver.Chrome(r"E:\chromedriver_win32\chromedriver.exe") #实例化一个driver
driver.get("https://www.bilibili.com/v/kichiku/mad/?spm_id_from=333.5.b_7375626e6176.3#/") #发送请求
driver.find_element_by_xpath("//button[@class='nav-btn iconfont icon-arrowdown3']").click() #定位【下一页】按钮,并点击
time.sleep(3) #睡3秒
result = driver.find_elements_by_xpath("//ul[@class='vd-list mod-2']/li//a[@class='title']") #提取这一页的内容
for title in result:
print(title.text)
driver.quit()