薛定谔的小笼包·

薛定谔的小笼包·

一. 窗口切换+内联框架

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

10-27 23:39