前言
ui自动化测试,就是通过代码模拟手工操作,通过点击、拖拽、输入等方式,进行浏览器页面的操作,我们常用的web自动化测试工具,是selenium;同时在我们日常操作中,由于需要创建链接,加载页面,切换窗口等各情况,但是代码的执行是非常快的,我们怎么样才能实现我们需要的操作呢,此时,就需通过切换、等待等方式进行操作了。
一、selenium的三大切换
三大切换,包含三种切换方式:窗口切换,iframe切换、alert弹框切换
1、窗口切换
获取当前句柄 driver.current_window_handle
获取当前所有窗口句柄 driver.window_handles
切换至最新的窗口 driver.switch_to.window(driver.window_handles[-1])
切换至第一各窗口 driver.switch_to.window(driver.window_handles[0])
# 窗口切换
from selenium import webdriver
driver = webdriver.Chrome() # 获取浏览器
driver.implicitly_wait(10) # 隐形等待,等待元素加载
driver.get('http://www.baidu.com') # 访问url地址
elem = driver.find_element('id','kw') # 元素定位
elem.send_keys('haha') # 输入
elem.submit() # 提交
driver.find_element_by_partial_link_text('百度翻译').click()
print(driver.window_handles) # 获取所有窗口句柄
print(driver.current_window_handle) # 获取当前窗口句柄
driver.switch_to.window(driver.window_handles[-1]) # 切换至最新的窗口
time.sleep(2)
print(driver.current_window_handle) # 获取当前窗口句柄
print(driver.title) # 打印浏览器标题
怎么判断自己处于iframe界面呢,通过F12,ctrl + F,进行编写xpath表达式,确定表达式时唯一的,但是还是无法成功获取元素, 此时通过查看你要定位的元素上下,是否有iframe的字眼,以确认:
iframe基本操作有三种方式:
1)通过index索引获取 driver.switch_to.frame(0)
2)如有name元素,通过name元素获取,直接传入值即可 driver.switch_to.frame("iframeResult")
3)通过iframe WebElement获取
locator=['id','kw']
driver.switch_to.frame(locator)
# iframe切换
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('https://www.csdn.net/')
driver.switch_to.frame(0) # 切换至iframe
elem = driver.find_element('xpath',"//div[@id='app']//div[@id='7574']") # 在iframe中进行元素定位
print(elem)
3、alert弹框切换
my_alert = driver.switch_to.alert
my_alert.accept() # 确认
my_alert.dismiss() # 取消
elem = driver.find_element('xpath','//h2')
elem.click()
my_alert = driver.switch_to.alert # 切换至alert弹框
my_alert.accept() # 确认
my_alert.dismiss() # 取消
elem1 = driver.find_element('id','kw') # 操作完alert弹框后,再进行元素定位
二、selenium的三种等待方式
1、强制等待(硬性等待)
强制等待 n 秒钟,每用一次就添加一次
time.sleep(2)
2、隐形等待(智能等待)
单位为s,表在 n 秒内以最快的速度返回,但只能用来等待元素,启动浏览器后,只需设置一次
driver.implicity_wait(10)
3、显性等待
每用一次就需启动一次,不仅可等待元素,还可其他等待,超时每找到,会报错。
另外,等待时间是死的,一般可被time.sleep(2)取代,
wait = WebDriverWait(driver,10)
wait.until(expected_conditions.title_contains('xxx')) # 等待直到标题包含xxx
locator = ['id','kw']
elem = wait.until(expected_conditions.element_to_be_clickable(locator)) # 等待元素可被点击
elem = wait.until(expected_conditions.presence_of_element_located(locator)) # 等待某个元素加载
elem = wait.until(expected_conditions.visibility_of_element_located(locator)) # 等待元素可被看见
from selenium import webdriver
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions
driver = webdriver.Chrome()
driver.implicitly_wait(10) # 隐性等待,在10s内以最快的速度返回结果,但只能等待元素,全局设置一次
driver.get('http://www.baidu.com')
elem = driver.find_element('id','kw')
elem.send_keys('haha')
elem.submit()
# time.sleep(3) # 强制等待,必须等三秒钟
# print(driver.title) # 还没加载完成,无法定位到我们想要的页面元素,此项需要用等待
# driver.quit()
wait = WebDriverWait(driver,10) # 显性等待,等待条件,直到标题中包含‘haha’文本
wait.until(expected_conditions.title_contains('haha'))
print(driver.title)
driver.quit()
三、selenium的三大切换等待方式
1、窗口切换等待
wait = WebDriverWait(driver,4) # 初始化等待器
all_handles = driver.window_handles # 获取点击前的所有窗口
wait.until(expected_conditions.new_window_is_opened(all_handles)) # 通过显性等待,等待新窗口出现
driver.switch_to.window(driver.window_handles[-1]) # 需手动切换至最新窗口
# 窗口切换等待
from selenium import webdriver
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
import time
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')
elem = driver.find_element('id','kw')
elem.send_keys('haha')
elem.submit()
all_handles = driver.window_handles # 获取点击前的所有窗口
driver.find_element_by_partial_link_text('百度翻译').click()
wait = WebDriverWait(driver,2)
wait.until(expected_conditions.new_window_is_opened(all_handles)) # 通过显性等待,等待新窗口出现
driver.switch_to.window(driver.window_handles[-1]) # 切换至最新窗口
time.sleep(2)
print(driver.title)
2、iframe切换等待
wait = WebDriverWait(driver,4) # 初始化等待器
wait.until(expected_conditions.frame_to_be_available_and_switch_to_it(0)) # 等待并自动切换至iframe
# iframe切换
from selenium import webdriver
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('https://www.csdn.net/')
wait = WebDriverWait(driver,4)
wait.until(expected_conditions.frame_to_be_available_and_switch_to_it(0)) # 等待并切换至iframe
elem = driver.find_element('xpath',"//div[@id='app']//div[@id='7574']")
print(elem)
3、alert切换等待
wait = WebDriverWait(driver,4) # 初始化等待器
wait.until(expected_conditions.alert_is_present()) # 等待并自动切换至iframe
总结
以上为三大切换和三大等待的简单操作,了解的比较片面,先记录至此。
最近心情:
感觉每天都在等等等,真的感觉好无谓啊,哎,讨厌现在的自己,快点解决、结束现在的情景吧,赶紧调整心态,fighting!!
完结,撒花花花花花花花~~~!!!!!!