selenium
Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera,Edge等。这个工具的主要功能包括:测试与浏览器的兼容性——测试应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成.Net、Java、Perl等不同语言的测试脚本。
文章目录
day4 selenium的使用
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接调用浏览器,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏等。我们可以使用selenium很容易完成之前编写的爬虫。
安装:pip/pip3 install selenium
下载版本符合的webdriver:找到对应的Microsoft Edge浏览器版本号,下载压缩包解压得到可执行文件,对其配置环境变量。webdriver下载地址
https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
import time
from selenium import webdriver
# 通过指定chromedriver的路径来实例化driver对象,chromedriver放在当前目录。
# driver = webdriver.Chrome(executable_path='./chromedriver')
# chromedriver已经添加环境变量
driver = webdriver.Edge()
driver.get("http://www.baidu.com")
# 在百度搜索框中搜索'python'
driver.find_element_by_id('kw').send_keys('python')
# 点击百度搜索
driver.find_element_by_id('su').click()
time.sleep(5)
# 退出
driver.quit()
webdriver.Chrome(executable_path='./chromedriver')
中executable参数指定的是下载好的chromedriver文件的路径driver.find_element_by_id('kw').send_keys('python')
定位id属性值是’kw’的标签,并向其中输入字符串’python’driver.find_element_by_id('su').click()
定位id属性值是su的标签,并点击
click函数作用是:触发标签的js的click事件
driver常用属性
from selenium import webdriver
url = 'http://www.baidu.com'
driver = webdriver.Edge()
driver.get(url)
# 当前标签页浏览器渲染之后的网页源代码
print(driver.page_source)
#当前标签页的ur
print(driver.current_url)
# 关闭当前标签
driver.close()
# 当get新的网页时,此属性可以实现网页前进,back()可以实现回退当前一个页面
print(driver.forward())
# 页面截图 一般用于获取网页图片分析
driver.screen_shot("images.png")
# 关闭浏览器
driver.quit()
driver对象定位标签元素获取标签对象的方法
find_element_by_id (返回一个元素)
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选择器来获取元素列表)
注意:
-
find_element和find_elements的区别:
- 多了个s就返回列表,没有s就返回匹配到的第一个标签对象
- find_element匹配不到就抛出异常,find_elements匹配不到就返回空列表
-
by_link_text和by_partial_link_tex的区别:全部文本和包含某个文本
-
以上函数的使用方法
driver.find_element_by_id('id')
标签对象提取文本内容和属性值
find_element仅仅能够获取元素,不能够直接获取其中的数据,如果需要获取数据需要使用以下方法:
点击 element.clock()
输入框输入内容: element.send_keys(data)
获取文本:element.text
获取属性值element.get_attribute("属性名")
以获取五八同城某一页面用户名为例:
from selenium import webdriver
url = 'https://cd.58.com/danche/?utm_source=market&spm=u-2d2yxv86y3v43nkddh1.BDPCPZ_BT&PGTID=0d100000-0006-6e3d-a96c-6d872bd843fd&ClickID=2'
driver = webdriver.Edge()
driver.get(url)
text_list = driver.find_elements_by_xpath('//tbody/tr/td[2]/a[1]/div[1]')
i = 0
while i<len(text_list):
print(text_list[i].text)
i = i+1
selenium的其他用法
selenium标签页的切换
当selenium控制浏览器打开多个标签页时,如何控制浏览器在不同的标签页中进行切换
1.获取所有标签页的窗口句柄
2.利用窗口句柄字切换到句柄指向的标签页
具体方法
在这里插入代码片
实例化代码
from selenium import webdriver
import time #sleep
# 目标访问地址
url = 'https://cd.58.com/?utm_source=market&spm=u-2d2yxv86y3v43nkddh1.BDPCPZ_BT'
# 实例化浏览器webdriver对象
driver = webdriver.Edge()
# 获取连接
driver.get(url)
time.sleep(2)
# 打印当前句柄
current_windows = driver.window_handles
print(current_windows)
# 获取当前网络元素 执行点击操作
element = driver.find_element_by_xpath('/html/body/div[3]/div[1]/div[1]/div/div[1]/div[1]/span[1]/a').click()
# 获取当前窗口句柄
current_windows = driver.window_handles
print(current_windows)
# 句柄切换
driver.switch_to.window(current_windows[-1])
# 定位新元素
elements = driver.find_elements_by_xpath('/html/body/div[6]/div[2]/ul/li/div[2]/h2/a')
print(elements)
time.sleep(5)
driver.close()
switch_to切换frame标签
iframe是html中常用的一种技术,即一个页面中嵌套了另一个网页,selenium默认是访问不了frame中的内容的,对应的解决思路是driver.switch_to.frame(frame_element)
。
import time
from selenium import webdriver
driver = webdriver.Chrome()
url = 'https://mail.qq.com/cgi-bin/loginpage'
driver.get(url)
time.sleep(2)
login_frame = driver.find_element_by_id('login_frame') # 根据id定位 frame元素
driver.switch_to.frame(login_frame) # 转向到该frame中
driver.find_element_by_xpath('//*[@id="u"]').send_keys('1596930226@qq.com')
time.sleep(2)
driver.find_element_by_xpath('//*[@id="p"]').send_keys('hahamimashicuode')
time.sleep(2)
driver.find_element_by_xpath('//*[@id="login_button"]').click()
time.sleep(2)
"""操作frame外边的元素需要切换出去"""
windows = driver.window_handles
driver.switch_to.window(windows[0])
content = driver.find_element_by_class_name('login_pictures_title').text
print(content)
driver.quit()
selenium对cookie的处理
selenium能够帮助我们处理页面中的cookie,比如获取、删除,driver.get_cookies()
返回列表,其中包含的是完整的cookie信息!不光有name、value,还有domain等cookie其他维度的信息。所以如果想要把获取的cookie信息和requests模块配合使用的话,需要转换为name、value作为键值对的cookie字典。
# 获取当前标签页的全部cookie信息
print(driver.get_cookies())
# 把cookie转化为字典
cookies_dict = {cookie['name']: cookie['value'] for cookie in driver.get_cookies()}
删除cookie
#删除一条cookie
driver.delete_cookie("CookieName")
# 删除所有的cookie
driver.delete_all_cookies()
selenium控制浏览器执行js代码
import time
from selenium import webdriver
# 如果元素没有出现在当前视野中,则要操作鼠标让页面下拉。否则将会报错
driver = webdriver.Edge()
driver.get("http://baidu.com)
time.sleep(1)
# scrollTo(x,y) 一般现在浏览器为宽屏浏览器,不用设置具体值。 document.body.scrollHeight
js = 'window.scrollTo(0,document.body.scrollHeight)'
# 执行js
driver.execute_script(js)
time.sleep(5)
driver.quit()
页面等待
页面在加载的过程中需要花费时间等待网站服务器的响应,在这个过程中标签元素有可能还没有加载出来,页面等待来解决这个问题。
具体分类
- 强制等待:time.sleep()
- 隐式等待:隐式等待针对的是元素定位,隐式等待设置了一个时间,在一段时间内判断元素是否定位成功,如果完成了,就进行下一步;在设置的时间没有完成定位成功,就会超时报错。
**from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10) # 隐式等待,最长等20秒
driver.get('https://www.baidu.com')
driver.find_element_by_xpath()**
- 显式等待:每经过多少秒就查看一次等待条件是否达成,如果达成就停止等待,继续执行后续代码;没有完成等待,直到超过了规定时间,就会报错。
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, 20, 0.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开启无界面模式
绝大多数服务器是没有界面的,selenium控制浏览器也是存在无界面模式的,这一小节我们就来学习如何开启无界面模式(又称之为无头模式)
开启无界面模式的方法:
import time
from selenium import webdriver
# 创建一个配置对象
options = webdriver.EdgeOptions()
# 开启无界模式
options.add_argument("--headerss")
# 禁止使用gpu
options.add_argument('--disable-gpu')
# 实例化带参数的driver对象
driver = webdriver.Edge(options=options)
driver.get('http://www.baidu.com')
print(driver.title)
time.sleep(30)
driver.quit()
selenuim使用代理ip
selenium控制浏览器也是可以使用代理ip的!
from selenium import webdriver
# 创建一个配置对象
options = webdriver.EdgeOptions()
# 使用代理i
options.add_argument('--proxy-server=http://180.120.182.149:9999')
# 实例化带有配置的driver对象
driver = webdriver.Edge(options=options)
driver.get('http://www.itcast.cn')
print(driver.title)
driver.quit()
selenium替换user-agent
from selenium import webdriver
options = webdriver.EdguOptions() # 创建一个配置对象
options.add_argument('--user-agent=Mozilla/5.0 HAHA') # 替换User-Agent
driver = webdriver.Edgu(options=options)
driver.get('http://www.itcast.cn')
print(driver.title)
driver.quit()
___ 2022.04.14