1、什么是selenium
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏。
2、PhantomJS的介绍
PhantomJS 是一个基于Webkit的“无界面”(headless)浏览器,它会把网站加载到内存并执行页面上的 JavaScript。下载地址
3、Chromedriver的介绍
Chromedriver 也是一个能够被selenium驱动的浏览器,但是PhantomJS的区别在于它是有界面的。下载地址
4、driver的安装
- 操作系统 (浏览器) 浏览器的driver 三者要版本相符
- pip insatll selenium
5、简单使用
from selenium import webdriver
driver = webdriver.Chrome(chromedriver_path)
driver.get(url)
driver.quit()
程序实例:
import time
from selenium import webdriver
driver = webdriver.Chrome(executable_path='/home/worker/Desktop/driver/chromedriver')
driver.get("https://www.baidu.com/")
driver.find_element_by_id('kw').send_keys('python')
driver.find_element_by_id('su').click()
time.sleep(6)
driver.quit()
6、定位的方法
driver.find_element_by_id()
driver.find_element_by_class_name()
driver.find_element_by_css_selector()
driver.find_element_by_link_text() # 根据 链接的文本内容 去定位标签
driver.find_element_by_partial_link_text() # 根据 链接的部分文本内容 定位标签对象
driver.find_element_by_name()
driver.find_element_by_tag_name()
driver.find_element_by_xpath()
# find_elements_... 表示获取全部
程序实例:
from selenium import webdriver
# driver = webdriver.Chrome('/home/worker/Desktop/driver/chromedriver')
driver = webdriver.PhantomJS('/home/worker/Desktop/driver/phantomjs')
driver.get("https://www.douban.com/")
ret1 = driver.find_element_by_id("anony-nav")
print(ret1)
ret2 = driver.find_elements_by_id("anony-nav")
print(ret2)
#输出为:[<selenium.webdriver.remote.webelement.WebElement (session="ea6f94544ac3a56585b2638d352e97f3", element="0.5335773935305805-1")>]
ret3 = driver.find_elements_by_xpath("//*[@id='anony-nav']/h1/a")
print(len(ret3))
#输出为:1
ret4 = driver.find_elements_by_tag_name("h1")
print(len(ret4))
#输出为:1
ret5 = driver.find_elements_by_link_text("下载豆瓣 App")
print(len(ret5))
#输出为:1
ret6 = driver.find_elements_by_partial_link_text("豆瓣")
print(len(ret6))
#输出为:24
driver.save_screenshot('douban.png')
input('sss')
driver.quit()
7、driver的其它的方法或属性
driver.page_source # 查看网页源码
driver.get_cookies() # 获取当前标签页的全部cookies
driver.current_url # 获取当前页面的url
driver.close() #退出当前页面
driver.quit() #退出浏览器
driver.forward()
driver.back()
8、提取文本内容、属性值
获取文本:element.text # 获取的是element中所有的文本内容!
获取属性值:element.get_attribute(“href”)
如果提取的是链接的url地址,会自动拼接再返回
也可以利用driver.page_source来进行提取
9、获取当前标签页中的所有cookies
driver.get_cookies()
# 利用selenium去登陆,获取cookies,再利用requests携带cookies发送请求获取响应
# 返回字典构成的列表
{cookie['name]:cookie['value']
for cookie in driver.get_cookies()}
#删除一条cookie
driver.delete_cookie("CookieName")
# 删除所有的cookie
driver.delete_all_cookies()
程序实例:
from selenium import webdriver
# 实例化driver,传入chromedriver的路径
driver = webdriver.Chrome('/home/worker/Desktop/driver/chromedriver')
# 访问url
url = 'https://www.baidu.cn'
driver.get(url)
# print(driver.get_cookies())
# cookies_dict = {cookie['name']:cookie['value'] for cookie in driver.get_cookies()}
# print(cookies_dict)
driver.delete_cookie('BIDUPSID')
print({cookie['name']:cookie['value'] for cookie in driver.get_cookies()})
driver.delete_all_cookies()
print(driver.get_cookies())
input('ss')
driver.quit()
10、页面等待
手动等待不断判断页面中某个标签是否出现
强制等待 <time.sleep()>
显式等待
# 20 表示最长时间 0.5表示刷新频率
# By.LINK_TEXT == driver.find_element_by_link_text()
WebDriverWait(driver,20,0.5).until(
EC.presence_of_element_located((By.LINK_TEXT, 'CSDN')))
print driver.find_element_by_link_text('CSDN').get_attribute('href')
driver.close()
隐式等待
driver.implicitly_wait(20)
设置js加载时长限制
图片加载时长限制
html加载时长限制
11、让selenium控制浏览器执行js代码
driver.execute_script(js_str)
程序实例:
import time
from selenium import webdriver
dirver = webdriver.Chrome("/home/python/Desktop/工具/chromedriver")
dirver.get("https://www.taobao.com")
i = 0
while True:
i += 1
js = "window.scrollTo(0,document.body.scrollTop={})".format(500*i)
dirver.execute_script(js)
time.sleep(2)
try:
element = dirver.find_element_by_xpath("//div[@class='goods-inner']/h3[1]/img[1]")
print(element.get_attribute('title'))
break
except Exception as e:
print(e)
# print(dirver.page_source)
dirver.quit()
12、switch
# 1. 获取当前所有的窗口的id字符串构成的list
current_windows = driver.window_handles
# 2. 根据窗口列表索引进行切换
driver.switch_to.window(current_windows[1])
# 3. html中如果嵌套html,需要把焦点切换到相应的Html中,才能进行操作
# frame标签 iframe标签的 切入 以及 切出
login_frame = driver.find_element_by_id('login_frame') # 定位frame元素
driver.switch_to.frame(login_frame) # 转向到该frame中
程序实例:
import time
from selenium import webdriver
driver = webdriver.Chrome(executable_path='/home/worker/Desktop/driver/chromedriver')
driver.get("https://www.baidu.com/")
time.sleep(1)
driver.find_element_by_id('kw').send_keys('python')
time.sleep(1)
driver.find_element_by_id('su').click()
time.sleep(1)
# 通过执行js来新开一个标签页
js = 'window.open("https://www.sogou.com");'
driver.execute_script(js)
time.sleep(1)
print(driver.current_url) # 可以根据当前的url来确定此时driver焦点所在哪个标签页!
# 1. 获取当前所有的窗口
windows = driver.window_handles
print(windows)
time.sleep(2)
# 2. 根据窗口索引进行切换
driver.switch_to.window(windows[0])
time.sleep(2)
driver.switch_to.window(windows[1])
time.sleep(6)
driver.quit()
13、chromedriver的无界面(headless)模式
option = webdriver.ChromeOptions()
option.add_argument('--headless') # 开启无界面模式
option.add_argument('--disable-gpu') # 禁用显卡
driver = webdriver.Chrome(executable_path='/home/worker/Desktop/driver/chromedriver',chrome_options=option)
import time
from selenium import webdriver
# 创建一个配置对象
option = webdriver.ChromeOptions()
option.add_argument('--headless') # 开启无界面模式
option.add_argument('--disable-gpu') # 禁用gpu ,可以解决一些莫名的问题
option.add_argument('--user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36') # 禁用gpu ,可以解决一些莫名的问题
# proxy_str = '115.182.212.169:8080'
# option.add_argument('--proxy-server=https://{}'.format(proxy_str)) # 使用代理ip
# option.set_headless() # 无界面模式的另一种开启模式
driver = webdriver.Chrome('/home/python/Desktop/工具/chromedriver', chrome_options=option)
driver.get('https://mail.qq.com')
print(driver.find_element_by_xpath('//a').get_attribute('href'))
time.sleep(2)
login_frame = driver.find_element_by_id('login_frame')
elements = driver.switch_to_frame(login_frame)
driver.find_element_by_id('u').send_keys('1777888852')
time.sleep(2)
driver.find_element_by_id('p').send_keys('123456789')
time.sleep(1)
driver.find_element_by_id('login_button').click()
input('333')
driver.quit()