一. 窗口切换+内联框架
01标签页切换
from selenium import webdriver
import time
browser=webdriver.Chrome()
browser.get("https://www.baidu.com/")
#windows.open传要打开页面的链接 会在新的标签页访问这个链接
browser.execute_script('window.open("https://www.douban.com/")')
time.sleep(2)
browser.execute_script('window.open("https://cn.bing.com/?mkt=zh-cn")')
time.sleep(2)
print(browser.title)#selenium当前标签页 默认指向get方法访问的页面
#获取所有标签页的窗口句柄
windows=browser.window_handles#返回列表
#利用窗口句柄切换标签页
for i in windows:
print(i)
browser.switch_to.window(i)
print(browser.title)
#百度 必应 豆瓣 ====倒序==1,4,3,2,
02表单切换
用Selenium动作
二. Selenium动作
01模拟输入与点击
使用send_keys()模拟输入
`send_keys()`方法是Selenium中用于向指定元素发送字符串输入的关键方法,通过此方法,可以模拟用户在文本框内输入文字的行为,实现自动化测试中的输入操作。
使用click()模拟点击
`click()`方法使Selenium能够模拟鼠标点击操作,对网页上的按钮、链接等可交互元素执行点击,是实现页面跳转和表单提交等用户行为的重要手段。
实例化浏览器驱动
在Selenium中,首先需要实例化一个浏览器驱动对象,如Chrome或Firefox,这是进行后续页面访问、元素定位及模拟操作的前提步骤,确保自动化测试能在特定浏览器环境下执行。
02动作链使用
"""
需求:拖动小方块 移动到大方块上面 看到页面弹窗
1.定位到小方块
2.按住小方块不松开
3.往右移 滑动x距离(到大方块上)
4.松开鼠标左键
"""
from selenium import webdriver
import time
from selenium.webdriver import ActionChains
browser=webdriver.Chrome()
browser.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
#进入到iframeResult的页面
browser.switch_to.frame('iframeResult')#传内联框架元素的ID 若果没有可以元素定位到这个标签 然后传进去
#1.定位到小方块
element=browser.find_element_by_id('draggable')#seleninm默认只能拿到最外层的内容,里面拿不到
print(element)
#2.按住小方块不松开
action=ActionChains(browser)#实例化动作链 传入驱动对象
action.click_and_hold(element)#点击长安指定标签
#3.往右移 滑动x距离(到大方块上)
action.move_by_offset(280,0)#左右移动 传参数x,y
action.release()
action.perform()#执行动作连中的动作
click_and_hold()- 点击且长按指定标签
drag_and_drop()- 拖动
move_to_element() - 鼠标移动到某个元素
move_by_offset() - 鼠标从当前位置移动到某个坐标
release() - 在某个位置松开鼠标左键
perform() - 执行链中的所有动作
move_to_element_with_offset()
- 移动到距某个元素(左上角坐标)多少距离的位置
key_up() - 松开某个键
三. Selenium配置项
01无头模式
- 无头模式是Selenium的一种配置,允许浏览器在后台运行,不显示图形用户界面,适用于服务器环境或连续集成系统,无需实际显示器。
- 通过实例化ChromeOptions对象,添加'--headless'参数,然后使用配置对象启动Chrome浏览器,即可实现无头模式,使浏览器在后台运行。
- 无头模式节省了图形界面的开销,提高了测试效率,特别适用于需要大量自动化测试的服务器环境或连续集成系统。
from selenium import webdriver option= webdriver.ChromeOptions() # 实例化配置对象 option.add_argument('--headless') # 指定无头模式 无界面启动 browser = webdriver.Chrome(options =option) browser.get('https://www.baidu.com/') print(browser.title)
02防检测设置
(1)修改navigator.webdriver属性
- 通过将navigator.webdriver属性设置为undefined或false,可以有效地避免网站通过检测此属性来识别自动化脚本的访问,从而提高爬虫操作的隐蔽
(2)使用无界面模式
- 无界面模式(headless mode)允许Selenium在不显示浏览器界面的情况下运行,这减少了被网站检测到的可能性,同时提高了自动化测试或爬虫的效率和隐蔽性。
(3)更改用户代理设置
- 通过更改用户代理(User-Agent)字符串,模拟不同的浏览器和操作系统访问,可以有效避免因用户代理识别而导致的自动化脚本检测,增加爬虫操作的成功率。
from selenium import webdriver option= webdriver.ChromeOptions() # 实例化配置对象 #option.add_argument('--headless') # 指定无头模式 无界面启动 browser = webdriver.Chrome(options =option) #防检测 #1.window.navigator.webdriver 为true代表检测到自动化 这个代码是修改 window.navigator.webdriver为undefined 可以改为false browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """ Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) """}) #2.更换ip option.add_argument('User-Agent={}'.format('Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.70 Safari/537.36')) #3.更换ip option.add_argument('--proxy-server=http://ip:port') browser.get('https://www.baidu.com/') print(browser.title) #更多伪装可搜“selenium防检测配置项”
四. 元素等待
01为什么需要等待
- 网页加载机制
网页在打开时,会按顺序加载HTML、CSS和JS文件。这一过程不仅依赖文件的加载顺序,还可能受到网络波动的影响,导致元素加载延迟。
- 元素定位挑战
由于页面元素需要等待相关文件加载完成才能被准确定位,如果过早尝试访问未完全加载的元素,可能会导致定位失败,进而影响后续操作。
- 等待的必要性
设置元素等待可以确保在指定元素被加载出来之后再进行定位,这样可以避免因元素未加载完成而导致的定位失败,提高网页自动化测试的准确性和效率。
02等待方法
- 强制等待
强制等待通过使用`time.sleep()`函数实现,此方法使程序暂停执行指定的秒数,无论页面加载情况如何,都必须等待完整的时间才能继续。
- 隐式等待
隐式等待通过一次设置`implicitly_wait()`函数实现,它为网页加载设定一个最长等待时间,如果在该时间内网页加载完成则立即继续,否则会一直等到时间结束
- 显式等待
显式等待利用`WebDriverWait`配合条件判断(`until`或`until_not`)进行元素定位,只有当元素出现或满足指定条件时才执行后续操作,若超时未满足条件则抛出异常。
03隐式等待设置
implicitly_wait() 如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。抛出异常 隐式等待是全局性的 只需要设置一次 即运行过程中,如果元素可以定位到,它不会影响代码运行,但如果定位不到,则它会以轮询的方式不断地访问元素直到元素被找到,若超过指定时间,则抛出异常。
04显式等待设置
until(method, message=’ ‘)
method:指定预期条件的判断方法,在等待期间,每隔一段时间调用该方法,判断元素是否存在,直到元素出现
message: 如果超时,抛出 TimeoutException ,并显示 message 中的内容
until_not(method, message=’ ‘)
until_not 正好相反,当元素消失或指定条件不成立,则继续执行后续代码
- 可以它看成是局部变量,作用于指定元素
- 就是直到元素出现才去操作,如果超时则报异常
- 显示等待需要使用 WebDriverWait,同时配合 until 或 not until