九、使用驱动.switch_to.alert 来获取页面上的JS对话框
由于JS对话框不是页面元素(不是标签,定位不到)
代码示例:
对话框 = 驱动.switch_to.alert # 获取页面对话框 对话框.text # 获取对话框上的提示文本 对话框.accept() # 点击对话框上的确定按钮 对话框.dismiss() # 点击对话框上的取消按钮 对话框.send_keys("内容") # 向对话框中的输入框中输入指定内容
十、使用驱动.switch_to.frame(xxx) 来切换框架
页面中,出现了 <frame> 或者 <iframe> 标签,引入了另外的html文件中的内容。这个时候,如果你需要在框架内部的页面html文件中,定位元素,就得切换框架。
切换进入到内部框架:
驱动.switch_to.frame(xxx)
传入框架标签的特征,作为参数:id属性、name属性、索引、框架标签元素;
从内部框架切出来:
驱动.switch_to.default_content() ------ 切换到最外部框架 驱动.switch_to.parent_frame() ------ 切换到上一级框架
十一、使用驱动.switch_to.window(xxx) 来切换窗口
通过操作当前窗口页面中的超链接,在浏览器中打开了新窗口,如果想要在新窗口中定位元素,就得先将驱动切换到新窗口。
每个打开的窗口,在浏览器中,都有一个唯一的编号(也称为句柄)
驱动.window_handles ------ 获取当前浏览器中,所有窗口的句柄列表 驱动.current_window_handle ------ 获取驱动对象,当前指向的窗口句柄
切换的方法:
驱动.switch_to.window(新窗口句柄) ------ 将驱动对象切换到指定的窗口上
常见的示例代码:
驱动.switch_to.window(驱动.window_handles[1])
十二、三种等待
强制等待(sleep实现的固定时长的休眠)
本质:调用time模块的sleep函数,让程序休眠指定的时长。
隐式等待(智能等待,智能:等到元素出现,就不等了)
思路:在创建了浏览器驱动对象之后,可以对驱动对象进行设置:隐式等待的设置,告之其在后期定位单个元素的时候,可以尝试等待一个最长的时间,如果元素出现了,就立刻返回这个元素,如果没有出现,就一直等待,要么等到元素出现,要么等到超过了最长的等待时候,而报错;
特点:
只需要在一开始设置一次,会影响接下来所有定位元素的方法。
后面元素定位的方法调用时,并没有什么不同,完全从代码上感觉不到是否进行了等待。
实现:
驱动.implicitly_wait(最长等待时间)
显式等待(智能等待,智能:等到元素出现,就不等了)
思路:创建一个 WebDriverWait 类的对象,调用它的 until 方法,会给这个方法传入一个条件,条件成立后,until方法才结束。在定位一个需要等待的元素的时候,我们会传入一个"被定位的元素的出现"条件,如果这个条件成立(被定位的元素出现了),则返回出现的这个页面元素。
特点:
哪个元素要显示等待,就明确在代码上体现出来。
如果超过最长的等待时间,until方法会报一个"超时的异常":TimeoutException示例:
pythonfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC # 定位元素的策略和值,组成一个元素定位器 ------ 由定位元素的策略和值,组成的元组和列表 locator = (By.ID, "cont") # 调用"等待对象"的until(直到)方法,等待被定为的元素出现(返回这个出现的元素)为止,或 者超时(报错) elem = WebDriverWait(驱动,30).until(EC.presence_of_element_located(locator))
十三、调用驱动.execute_script("JS代码") 执行JS代码
将js代码,发送到浏览器上,去执行。
实现: 驱动.execute_script("JS代码")
代码示例:
python# 将"实现去掉输入框只读属性的JS代码"发送到浏览器上去执行 dr.execute_script("document.getElementById('date1').removeAttribute('readonl y')") # 直接将测试用例的出生日期数据,输入到输入框中 dr.find_element(By.ID, "date1").send_keys("2024-2-5")
十四、使用ActionChains类,实现一些不常见的鼠标操作
双击、移动到元素上、拖拽这些不常见的操作,无法直接对"页面元素"进行操作。因此,需要借助ActionChains类来实现
思路:
pythonActionChains(驱动).操作1(元素).操作2(元素).....perform()
常见操作:
pythonmove_to_element(元素) ------ 移动鼠标到指定的元素上 double_click(元素) ------ 双击指定元素 click_and_hold(元素) ------ 点住元素不放 release() ------ 放开鼠标
示例代码:
pythonfrom selenium.webdriver.common.action_chains import ActionChains ActionChains(驱动).double_click(元素).perform() # 双击指定元素 ActionChains(驱动).move_to_element(元素).perform() # 移动到元素上 ActionChains(驱动).click_and_hold(元素1).move_to_element(元素2).release().perform() # 拖拽元素1到元素2中
十五、使用Keys类,实现特殊按键的发送
python
页面元素.send_keys("内容")
页面元素.send_keys(特殊按键, "小写的按键字母")
页面元素.send_keys(Keys.CONTROL, "a") ------ 全选
页面元素.send_keys(Keys.CONTROL, "c") ------ 复制
页面元素.send_keys(Keys.CONTROL, "v") ------ 粘贴
示例代码:
pythonfrom selenium.webdriver.common.keys from Keys 输入框元素.send_keys(Keys.CONTROL, "a") # 全选 输入框元素.send_keys(Keys.CONTROL, "c") # 复制 输入框元素.send_keys(Keys.CONTROL, "v") # 粘贴
十六、截图(拍快照,存储成png格式的图片文件)
将整个页面拍快照:
python驱动.get_screenshot_as_file("xxx.png")
将指定的元素拍快照:
python元素.screenshot("xxx.png")