selenium中三大切换 & 三种等待方式

前言

        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)  # 打印浏览器标题

2、iframe切换

         怎么判断自己处于iframe界面呢,通过F12,ctrl + F,进行编写xpath表达式,确定表达式时唯一的,但是还是无法成功获取元素, 此时通过查看你要定位的元素上下,是否有iframe的字眼,以确认:

selenium中三大切换 & 三种等待方式

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!!

完结,撒花花花花花花花~~~!!!!!!

上一篇:C++入门——vector容器


下一篇:19.scala的类型上下界