- 使用代码流程
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
- 截图
# 截图功能
# driver.save_screenshot('python.png')
el = driver.find_element_by_xpath('//*[@id="kw"]')
el.send_keys("百度")
el.sub = driver.find_element_by_xpath('//*[@id="form"]/span[2]')
el_sub.click()
- selenium前进后退
driver.back() # 后退
driver.forward() # 前进
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
el = driver.find_element_by_xpath('//*[@id="kw"]')
el.send_keys('百度')
el_sub = driver.find_element_by_xpath('//*[@id="su"]')
el_sub.click()
time.sleep(1)
driver.get("http://www.renren.com")
# 执行后退,后退到百度搜索结果
driver.back()
time.sleep(1)
# 前进到163
driver.forward()
time.sleep(3)
# 关闭
driver.close()
- 查看请求消息
print(driver.page_source) # 获取渲染之后的网页源代码
driver.get_cookies()
print(driver.current_url) # 获取当前标签页的url
- 退出
driver.close() # 退出当前页面
driver.quit() # 退出浏览器
- selenium定位元素语法(8种)(以百度为例)
find_element 返回是一个元素 /find_elements 返回是一个包含元素的列表
find_element 找不到元素会报错 /find_elements 匹配不到会返回一个空列表
by_link_text 根据链接文本获取元素列表(文本必须是完整的,全部文本) / by_partial_link_text 根据链接包含的文本获取元素(文本可以是不完整的的,包含某个文本)
通过标签可以定位(find_element(s)_by_tag_name('h1'))到动态的iframe
① # 通过xpath定位元素 (返回一个包含元素的列表)
el = driver.find_element(s)_by_xpath('//*[@id="kw"]')
② # 通过id定位元素 (返回一个元素)
el = driver.find_element_by_id('kw')
③ # 通过 name 定位 (返回一个元素)
el = driver.find_element(s)_by_name('wd')
④ # 通过 class 定位元素 (根据类名获取元素列表)
el = driver.find_element(s)_by_class_name('s_ipt')
⑤ # 通过css选择器进行元素定位 类选择
el = driver.find_element(s)_by_css_selector('#kw')
⑥ # (根据连接文本获取元素列表) 因为是链接可以在触发点击
el = driver.find_element(s)_by_link_text('hao123')
⑦ # (根据链接包含的文本获取元素列表)
el = driver.find_element(s)_by_partial_link_text('hao')
⑧ # (根据标签名获取元素列表)
el = driver.find_element(s)_by_tag_name('h1')
- 获取数据语法
find_element 仅仅能够获取元素,不能直接获取其中的数据,find_element_by_xpath 也是一样
获取文本:element.text
获取属性值:element.get_attribute("href")
数据提取:print(el.text,el.get_attribute('href'))
el.driver.find_element_by_xpath('xxxxxx') # input/text标签
el.send_keys('传智播客') # 括号里有什么就会向输入框里输入什么
- 标签切换(标签窗口)
有些时候如果没有进行标签切换是定位不到元素的,使用句柄,从而达到切换标签的目的,在一定程度上句柄具有唯一性
# window_handles中保存所有的窗口/标签句柄
print(driver.window_handles)
# 切换窗口句柄,从而切换控制的标签
driver.switch_to.window(driver.window_handles[-1])
- iframe标签(属于一种框架)
在一个HTML标签中嵌套另一个HTML标签,selenium只能定位到iframe标签,并不能定位到内部的标签
切换到框架中有两种方法:
一. 通过框架的id值尽心切换
driver.switch_to.frame(‘id值’)
二. 通过元素定位进行切换
el_frame = driver.find_element_by_xpath(‘xxx’)
driver.switch_to.frame(el_frame)
三. 在有些时候会遇到iframe内部只有id,且id位动态,这时候可以通过标签可以定位(find_element(s)_by_tag_name(‘h1’))到动态的iframe
- selenium对于cookie的处理
driver.find_element_by_id('email').send_keys('账号')
driver.find_element_by_id('assword').send_keys('密码')
driver.find_element_by_id('login').click
get_cookies() # 会获取浏览器记录的所有cookie列表
cookies_list = driver.get_cookies()
cookies = {}
for cookie in cookies_list:
cookies[cookie['name']] = cookie['value']
print(cookies)
# 可以用做requests直接用这种形式来获取cooie
session = requests.session()
session.get(url,cookies=cookies)
字典推导式:cookies_dict = {cookie['name']: cookie['value'] for cookie in driver.get_cookies()}
删除一条cookie:
driver.delete_cookie('CookieName')
删除所有cookie
driver.delete_all_cookies()
- 使用selenium控制浏览器执行js代码
from selenium import webdriver
url = 'https://taizhou.lianjia.com/'
driver = webdriver.Chrome()
driver.get(url)
# x:水平移动多少像素,y:垂直移动多少像素
#scroll_js = 'scrollTo(x,y)'
scroll_js = 'scrollTo(0,500)'
driver.execute_script() 实现向下移动的动作
driver.execute_script(scroll_js)
# el_img = driver.find_element_by_xpath('/html/body/div[2]/ul/li/a/img')
# el_img.click()
el_link = driver.find_element_by_xpath('/html/body/div[2]/ul/li/a')
el_link.click()
- 页面等待
页面等待(等页面渲染完毕之后在进行元素定位)
强制等待:time.sleep(3) 等待 3 秒
显示等待:指定某个元素,其他的元素不会管,
隐式等待:implicitly_wait(3) 等待3秒,在3秒时间内去一直定位,当定位到了就执行如果超过3秒还没有定位到在报错,有些类似于超时,像有些ajax请求可以用到会有一定的缓冲时间
from selenium import webdriver
url = 'http://www.baidu.com'
driver = webdriver.Chrome()
driver.implicitly_wait(10) # 隐式等待
driver.get(url)
driver.find_element_by_xpath('//*[@id="lg"]/img[10000]')
- 浏览器配置
代理服务器和开启无界面模式(无头模式)
from selenium import webdriver
# 创建配置对象
opt = webdriver.ChromeOptions()
# 配置配置对象
# opt.add_argument("--headless") # 设置无头
# opt.add_argument("--disable-gpu") # 设置关闭gpu
# opt.add_argument('--proxy-server=http://119.180.141.181:8060') # 配置对象添加使用代理ip的命令
opt.add_argument('--user-agent=Mozilla/5.0 HAHA') # 设置user-agent
# 创建浏览器对象的时候将配置对象添加
driver = webdriver.Chrome(chrome_options=opt)
driver.get("http://www.baidu.com")
# driver.save_screenshot("itcast.png") # 屏幕截屏