python中----selenium模块 - 前端笔记-#selenium的使用 1.selenium的介绍 Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium可以直接调用浏览器,它支持.....

学习笔记

点滴记忆
回忆过往
首页>> web后端 >>python中----selenium模块 - 前端笔记
2020-4-5
分类: web后端

python中----selenium模块

文章作者:痴迷

#selenium的使用 1.selenium的介绍 Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Seleniu......

#selenium的使用

1.selenium的介绍
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接调用浏览器,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏等。我们可以使用selenium很容易完成之前编写的爬虫,接下来我们就来看一下selenium的运行效果

2.selenium的工作原理
python代码 = > 浏览器厂商提供的api = > 浏览器

3.安装selenium
pip install selenium

4.安装webdriver   webdriver相当于每个浏览器厂商提供的api   (win10 64位系统为例)
webdriver分为 :无头浏览器(包含:phantomjs),有头浏览器(包含:主流浏览器,Chrome,IE)

chrome浏览器的webdriver的下载链接: https://npm.taobao.org/mirrors/chromedriver
一,先确认一下自己的浏览器的版本号 (我的版本号是:版本 80.0.3987.149(正式版本) (64 位) )
二,在链接上下载对应版本号的webdriver程序 (win32 你64位系统也是可以正常运行的)
三,把下载好的 webdriver.exe程序   所在目录配置到环境变量 (直接把webdriver放到python根目录也行)

5.简单的案例

import time
from selenium import webdriver
# 通过指定chromedriver的路径来实例化driver对象,chromedriver放在当前目录。
# driver = webdriver.Chrome(executable_path='./chromedriver')
# chromedriver已经添加环境变量
driver = webdriver.Chrome()             # 调用Chrome浏览器
driver.get("https://www.baidu.com/")    # 控制浏览器访问url地址
driver.find_element_by_id('kw').send_keys('python'# 在百度搜索框中搜索'python'
driver.find_element_by_id('su').click()   # 点击'百度搜索'
time.sleep(6)     # 延时6秒执行 下面代码
driver.quit()     # 退出浏览器


# driver对象的常用属性和方法
1. driver.page_source 当前标签页浏览器渲染之后的网页源代码
2. driver.current_url 当前标签页的url
3. driver.close() 关闭当前标签页,如果只有一个标签页则关闭整个浏览器
4. driver.quit() 关闭浏览器
5. driver.forward() 页面前进
6. driver.back() 页面后退
7. driver.save_screenshot('img_name.png') 页面截图

import time
from selenium import webdriver

driver = webdriver.Chrome()  # 调用Chrome浏览器
driver.get('https://www.baidu.com/')  # 访问 百度
print(driver.page_source)  # 获取网页源码
print(driver.current_url)  # 获取当前标签页的url

time.sleep(2)
driver.get('https://blog.dbsgw.cn/')  # 访问 前端博客

time.sleep(2)
driver.back()  # 页面后退

time.sleep(2)
driver.forward()  # 页面前进

time.sleep(2)
driver.back()

time.sleep(2)
driver.save_screenshot('baidu.png')  # 页面截图

driver.close()  # 关闭当前标签页,如果只有一个标签页则关闭整个浏览器
# driver.quit() # 关闭浏览器




#元素定位 数据提取

find_element_by_id            (返回一个元素)  id是唯一的所以没有加s的
find_element(s)_by_class_name       (根据类名获取元素列表)
find_element(s)_by_name         (根据标签的name属性值返回包含标签对象元素的列表)
find_element(s)_by_xpath        (返回一个包含元素的列表)
find_element(s)_by_link_text      (根据连接文本获取元素列表)
find_element(s)_by_partial_link_text  (根据链接包含的文本获取元素列表)
find_element(s)_by_tag_name       (根据标签名获取元素列表)
find_element(s)_by_css_selector     (根据css选择器来获取元素列表)

注意:
  1. find_element和find_elements的区别:
     多了个s就返回列表,没有s就返回匹配到的第一个标签对象
     find_element匹配不到就抛出异常,find_elements匹配不到就返回空列表
  2.by_link_text和by_partial_link_tex的区别:全部文本和包含某个文本
  3.以上函数的使用方法
     driver.find_element_by_id('id_str')

# 案例
import time
from selenium import webdriver
driver = webdriver.Chrome()  # 调用谷歌浏览器
driver.get('https://www.baidu.com/')
# driver.find_element_by_id('kw').send_keys('python3')                    #id定位
# driver.find_element_by_class_name('s_ipt').send_keys('calss定位')       #class定位
# driver.find_element_by_name('wd').send_keys('name定位')                 #name定位
# driver.find_element_by_xpath('//*[@id="kw"]').send_keys('xpath语法')    #xpath定位
num = driver.find_elements_by_css_selector('input')  # 获取页面中所以的input标签
for i in num: #循环 输出每个元素
  print(i)

# driver.find_element_by_id('su').click()  # 点击回车
time.sleep(3)
driver.close()  # 关闭当前页面




#标签对象提取文本内容和属性值

1.对元素执行点击操作`element.click()            对定位到的标签对象进行点击操作
2.向输入框输入数据`element.send_keys(data) 对定位到的标签对象输入数据
3.获取文本`element.text                           通过定位获取的标签对象的`text`属性,获取文本内容
4.获取属性值`element.get_attribute("属性名")         通过定位获取的标签对象的`get_attribute`函数,传入属性名,来获取属性的值

#案例
from selenium import webdriver
import time

driver = webdriver.Chrome()  # 调用谷歌浏览器
driver.get('https://www.dadayl.com/')
# print(driver.find_element_by_id('u_sp'))
num = driver.find_elements_by_css_selector('.news-article_container ul li')  # 查询文章类别
for i in num:
  # print(i.text) #获取文章列表的文字
  print(i.find_element_by_css_selector('a').get_attribute('href'), i.text)  # 获取a链接的链接 + 获取文字
time.sleep(3)  # 延迟3秒
driver.close()  # 关闭当前页面


# 案例 标签页的切换

1. 获取当前所有的标签页的句柄构成的列表
current_windows = driver.window_handles

2. 根据标签页句柄列表索引下标进行切换
driver.switch_to.window(current_windows[0])

import time
from selenium import webdriver

driver = webdriver.Chrome()  # 调用谷歌浏览器
driver.get('https://www.baidu.com/')  # 请求地址
print(driver.window_handles)  # 获取当前所有的标签页的句柄构成的列表

driver.find_element_by_xpath('//*[@id="virus-2020"]').click()  # xpath语法选择元素 点击打开新窗口

time.sleep(3)
driver.switch_to.window(driver.window_handles[0])  # 切换到 窗口0

time.sleep(3)
driver.switch_to.window(driver.window_handles[1])  # 切换到 窗口1

time.sleep(3)
driver.switch_to.window(driver.window_handles[0])  # 切换到 窗口0

print(driver.window_handles)  # 获取当前所有的标签页的句柄构成的列表

driver.quit()  # 退出浏览器


# 切换frame标签(frame框架)
iframe是html中常用的一种技术,即一个页面中嵌套了另一个网页,selenium默认是访问不了frame中的内容的,对应的解决思路是`driver.switch_to.frame(frame_element)`。接下来我们通过qq邮箱模拟登陆来学习这个知识点

import time
from selenium import webdriver

# emial = input('请输入邮箱')
# pw = input('请输入密码')
emial = 'xxxxx'
pw = 'xxxx'

driver = webdriver.Chrome()
driver.get('https://mail.qq.com/cgi-bin/loginpage')

driver.switch_to.frame(driver.find_element_by_id('login_frame')) #切换到frame 框架里面

driver.find_element_by_xpath('//*[@id="u"]').send_keys(emial)  # 输入邮箱
driver.find_element_by_xpath('//*[@id="p"]').send_keys(pw)  # 输入密码
driver.find_element_by_xpath('//*[@id="login_button"]').click()  # 单击登录

#############需要操作frame外边的元素需要切换出去
time.sleep(12)
driver.switch_to.window(driver.window_handles[0]) #切换到当前 能操控的页面
print(driver.find_element_by_xpath('//*[@id="logotips"]/div/div/span[4]/a[1]').text) #输入 邮箱首页




# selenium对cookie的获取和删除

1.获取cookie

print(driver.get_cookies())  # 获取当前标签页的全部cookie信息
cookies_dict = {cookie[‘name’]: cookie[‘value’] for cookie in driver.get_cookies()}  # 把cookie转化为字典

2.删除cookie

driver.delete_cookie("CookieName")  # 删除一条cookie
driver.delete_all_cookies()  # 删除所有的cookie

3.案例

from selenium import webdriver
driver = webdriver.Chrome()  #调用浏览器

driver.get('https://blog.dbsgw.cn/'# 发送请求
print(driver.get_cookies())  # 获取当前页的全部cookie
cookies_dict = {cookie['name']: cookie['value'for cookie in
                driver.get_cookies()}  # 推导式 获取cookie  (cookie最重要的就是name和value所以提取他们)
print(cookies_dict)   # 查看提取后的 cookie

driver.delete_cookie('CNZZDATA1278526282')  # 删除单独一个 cookie
print(driver.get_cookies(), 22222)  # 查看当前的cookie

driver.delete_all_cookies()  # 删除所有cookie
print(driver.get_cookies(), 3333)  # 查看当前的cookie



# selenium执行js语句
有时候selenium的内置方法不够满足自己的需求,就需要调用js操作浏览器了

import time
from selenium import webdriver

driver = webdriver.Chrome()  #调用谷歌浏览器
driver.get("https://voice.baidu.com/act/newpneumonia/newpneumonia/?from=osari_pc_1")

js = 'window.scrollTo(0,document.body.scrollHeight)'  # js语句
driver.execute_script(js)  # 执行js的方法

time.sleep(5#延时5秒
driver.quit() #关闭浏览器


# 页面等待
页面在加载的过程中需要花费时间等待网站服务器的响应,在这个过程中标签元素有可能还没有加载出来,是不可见的,如何处理这种情况呢?

1.强制等待
  就是强制等待3秒      time.sleep(3)

2.隐式等待
  隐式等待针对的是元素定位,隐式等待设置了一个时间,在一段时间内判断元素是否定位成功,如果完成了,就进行下一步,在设置的时间内没有定位成功,则会报超时加载

import time
from selenium import webdriver

url = 'https://blog.dbsgw.cn/'
driver = webdriver.Chrome()
driver.get(url) #发送请求

driver.implicitly_wait(10#隐式等待 10秒
driver.find_element_by_xpath('/html/body/section/div[1]/div/div[3]/ul/li[5]/a').click() #跳转到尾页

time.sleep(6)
driver.close()  #关闭当前页

3.显示等待   和隐式等待差不多  建议直接使用隐式等待
每经过多少秒就查看一次等待条件是否达成,如果达成就停止等待,继续执行后续代码 如果没有达成就继续等待直到超过规定的时间后,报超时异常
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

driver.get('https://www.baidu.com')

# 显式等待
WebDriverWait(driver, 200.5).until(
    EC.presence_of_element_located((By.LINK_TEXT'好123')))
# 参数20表示最长等待20秒
# 参数0.5表示0.5秒检查一次规定的标签是否存在
# EC.presence_of_element_located((By.LINK_TEXT, '好123')) 表示通过链接文本内容定位标签
# 每0.5秒一次检查,通过链接文本内容定位标签是否存在,如果存在就向下继续执行;如果不存在,直到20秒上限就抛出异常

print(driver.find_element_by_link_text('好123').get_attribute('href'))
driver.quit()




# selenium在谷歌浏览器中开启无界面模式

from selenium import webdriver

url = 'https://blog.dbsgw.cn/'

options = webdriver.ChromeOptions()  # 实例化配置对象
options.add_argument("--headless")  # 配置对象添加无界面模式
options.add_argument("--disable-gpu")  # 配置对象添加禁用gpu
driver = webdriver.Chrome(options=options)

driver.get(url)

driver.save_screenshot('前端笔记.png')  # 截图

driver.quit()  # 关闭浏览器




# selenium中使用代理ip

import time
from selenium import webdriver

url = 'https://blog.dbsgw.cn/'

options = webdriver.ChromeOptions()  # 实例化配置对象
# options.add_argument("--headless")  # 配置对象添加无界面模式
# options.add_argument("--disable-gpu")  # 配置对象添加禁用gpu
options.add_argument("--proxy-server=http://124.237.83.14:53281")  # ip代理
driver = webdriver.Chrome(options=options)

driver.get(url)

driver.save_screenshot('前端笔记.png')  # 截图

time.sleep(6)
driver.quit()  # 关闭浏览器



# selenium中设置 user-agent(浏览器请求头)

import time
from selenium import webdriver

url = 'https://blog.dbsgw.cn/'

options = webdriver.ChromeOptions()  # 实例化配置对象
# options.add_argument("--headless")  # 配置对象添加无界面模式
# options.add_argument("--disable-gpu")  # 配置对象添加禁用gpu
# options.add_argument("--proxy-server=http://124.237.83.14:53281") # ip代理
options.add_argument("--user-agent=python"# 浏览器头的配置 ,告诉别人我是python
driver = webdriver.Chrome(options=options)

driver.get(url)

driver.save_screenshot('前端笔记.png')  # 截图

time.sleep(6)
driver.quit()  # 关闭浏览器


×

感谢您的支持,我们会一直保持!

扫码支持
请土豪扫码随意打赏

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

打赏作者
版权所有,转载注意明处:前端笔记 » python中----selenium模块

发表评论

路人甲 表情
Ctrl+Enter快速提交

网友评论(0)