python3+selenium实现Web自动化4:元素三类等待,多窗口切换,警告框处理,下拉框选择

一、三类等待详解

  1. 强制等待(线程等待)
    需要设置固定的等待时间,无论元素是否加载完成,均需等待该时间
    由time.sleep()方法实现

不推荐使用

import time

time.sleep(5)     # 固定此段等待时间为5s

2.隐式等待
隐式等待是由webdriver提供的超时等待方法;
implicitly_wait()比 time.sleep() 更加智能,implicitly_wait()是在一个时间范围内智能等待,time.sleep() 只能选择一个固定的时间的等待;
当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常;
换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0;
一旦设置了隐式等待,则它存在整个 WebDriver 对象实例的声明周期中,隐式的等到会让一个正常响应的应用的测试变慢;
它将会在寻找每个元素的时候都进行等待,这样会增加整个测试执行的时间。

# 针对全局元素设置的等待时间
self.driver.implicitly_wait(20)

3.显式等待
显式等待是针对某个元素来设置的等待时间

在设置时间内,默认每隔一段时间检测一次当前。页面元素是否存在,如果超过设置时间检测不到则抛出异常。
一般搭配until()或until_not()方法配合使用,另外,lambda还提供了一个运行时动态创建函数的方法。

from selenium.webdriver.support.ui import WebDriverWait

WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id('test'))


**等待方法在自动化框架中如何封装**

定位元素

    def find_ele(self,*args):
        try:
            ele = WebDriverWait(self.driver,10).until(lambda x:x.find_element(*args))
            return ele
        except Exception:
            #在页面上没有定位到元素
            self.logger.error("元素定位失败:通过"+args[0]+"定位,元素是"+args[1]+"")

二、Selenium之-多窗口切换

在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要主机切换到新打开的窗口上进行操作。webdriver 中的 switch_to.window() 方法,可以实现在不同窗口之间切换。

current_window_handle:获得当前窗口句柄
window_handles:返回所有窗口的句柄到当前会话
switc_to.window():用于切换到相应的窗口
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@Time    :   2020/4/15
@Author  :   公众号:软测之家  更多技术干货,软测视频,面试资料请关注!
@Contact :   软件测试技术群:695458161
@License :   (C)Copyright 2017-2019, Micro-Circle
@Desc    :   None
"""

from selenium import webdriver
import time

base_url = 'https://www.baidu.com/'


browser = webdriver.Chrome('../tools/chromedriver.exe')
# 隐式等待10秒
browser.implicitly_wait(10)
browser.get(base_url)


# 获得搜索窗口的句柄
search_windows = browser.current_window_handle
browser.find_element_by_link_text('登录').click()
browser.find_element_by_link_text('立即注册').click()

# 活得当前打开窗口的句柄
all_handles = browser.window_handles

# 进入注册窗口
for handle in all_handles:
    if handle != search_windows:
        browser.switch_to.window(handle)
        print('now register window!')
        browser.find_element_by_name('account').send_keys('username')
        browser.find_element_by_name('password').send_keys('password')
        time.sleep(2)

browser.quit()

三、Selenium之-警告框处理

在 webdriver 中处理 JavaScript 所生成的 alert、confirm 以及 prompt 十分简单,具体做法是使用 switch_to.alert 方法定位到 alert/confirm/prompt,然后使用 text/accept/dismiss/ send_keys 等方法进行操作。

text:返回 alert/confirm/prompt 中的文字信息。
accept():接受现有警告框。
dismiss():解散现有警告框。
send_keys(keysToSend):发送文本至警告框。keysToSend:将文本发送至警告框。
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time

base_url = 'https://www.baidu.com/'
driver = webdriver.Chrome('../tools/chromedriver.exe')
driver.implicitly_wait(10)
driver.get(base_url)

# 鼠标悬停至 “设置” 链接
link = driver.find_element_by_link_text('设置')
ActionChains(driver).move_to_element(link).perform()

# 打开搜索设置
driver.find_element_by_link_text('搜索设置').click()
time.sleep(3)

# 点击 “搜索设置”
driver.find_element_by_class_name('prefpanelgo').click()
time.sleep(3)

# 接受警告框prefpanelgo
driver.switch_to.alert.accept()
time.sleep(3)

driver.quit()

四、Selenium之-下拉框处理

webdriver 提供了 Select 类来处理下拉框。

#!/usr/bin/env python
# -*- encoding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.support.select import Select
from time import sleep

base_url = 'https://www.baidu.com/'
driver = webdriver.Chrome('../tools/chromedriver.exe')
driver.implicitly_wait(10)
driver.get(base_url)

# 鼠标悬停至“设置”链接
driver.find_element_by_name('设置').click()
sleep(2)
# 打开 “搜索设置”
driver.find_element_by_name('搜索设置').click()
sleep(2)
# 搜索结果显示条数
# Select类用于定位select标签。
sel = driver.find_element_by_xpath("//select[@id='nr']")
# select_by_value() 方法用于定位下接选项中的value值。
Select(sel).select_by_value('50')

driver.quit()

参考链接:
https://www.cnblogs.com/csmashang/p/12706767.html

你可能感兴趣的:(python3+selenium实现Web自动化4:元素三类等待,多窗口切换,警告框处理,下拉框选择)