Alert,ActionChains,Keys,WebDriverWait类

Alert类

在UI的自动化测试实战中,针对弹出框的处理,主要使用的是Alert的类这部分,在JavaScript的

技术体系中,针对弹出框的部分,主要涉及到Alert警告框,Confirm确认框,Prompt消息框。下来

主要详细的说下Alert里面每个方法的具体使用

在Alert的类里面,涉及到的方法以及方法的作用主要汇总为如下:

  • text:获取弹出框的文本信息

  • accept是接受Confirm弹出框

  • dismiss是拒绝接受Confirm弹出框

  • send_keys是在Prompt消息对话框里面输入想要输入的内容

警告框

警告框的交互主要为比如在百度搜索设置后,点击保存,就会弹出警告框的交互

那么这部分就是弹出警告框的信息,下面通过详细的代码来演示这部分的交互过程

from selenium import  webdriver
import  time

driver=webdriver.Chrome()
driver.maximize_window()
driver.get('file:///C:/Users/85425/Desktop/%E8%AD%A6%E5%91%8A%E6%A1%86.html')
#获取警告框里面的文本信息
time.sleep(3)
print(driver.switch_to.alert.text)
#点击确定按钮
driver.switch_to.alert.accept()
time.sleep(3)
driver.close()

附带警告框源码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
        alert("这是一个警告框!")
    </script>
</head>
<body>
</body>
</html>

确认框的处理

对确认框的交互,一般都是会弹出确定或者是取消的交互,如果是确定,调用的的方法是accept,如果是取消,调用的方法是dismiss的方法。如下显示确认框的交互信息

from selenium import  webdriver
import  time
from selenium.webdriver.common.by import By

driver=webdriver.Chrome()
driver.maximize_window()
driver.get('file:///C:/Users/85425/Desktop/%E7%A1%AE%E5%AE%9A%E6%B6%88%E6%81%AF.html')
time.sleep(3)
driver.find_element(By.XPATH,'/html/body/center/input').click()
time.sleep(3)
driver.switch_to.alert.accept()
time.sleep(3)
#刷新
driver.refresh()
driver.find_element(By.XPATH,'/html/body/center/input').click()
time.sleep(2)
driver.switch_to.alert.dismiss()
time.sleep(3)
driver.close()

附带确认弹出框代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
        function disp_confirm()
        {
            var r=confirm("请您点击按钮!")
            if(r==true)
            {
                document.write("您点击了确认按钮")
            }
            else
            {
                document.write("您点击了取消按钮")
            }
        }
    </script>
</head>
<body>
<center>
    <input type="button" onclick="disp_confirm()" value="请点击">
</center>
</body>
</html>

消息对话框实战

下面再来具体说消息对话框这部分的应用和实战,消息消息对话框主要显示的是与用户交互的信息,那么调用的方法就是send_keys(),它的交互具体如下:

下面使用自动化测试的测试代码来具体查看这个交互过程

from selenium import  webdriver
import  time
from selenium.webdriver.common.by import By

driver=webdriver.Chrome()
driver.maximize_window()
driver.get('file:///C:/Users/85425/Desktop/%E6%B6%88%E6%81%AF%E5%AF%B9%E8%AF%9D%E6%A1%86(2).html')
time.sleep(3)
driver.find_element(By.XPATH,'/html/body/center/input').click()
time.sleep(3)
#输入内容
driver.switch_to.alert.send_keys('ghj')
time.sleep(2)
driver.switch_to.alert.accept()
time.sleep(3)
driver.close()

html源码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
        function disp_prompt()
        {
            var name=prompt("请输入您的姓名:","")
            if(name!=null && name!="")
            {
                document.write("Hello "+name+"")
            }
        }
    </script>
</head>
<body>
<center>
    <input type="button" onclick="disp_prompt()" value="请点击我!">
</center>
</body>
</html>

ActionChains类

ActionChains主要是针对鼠标事件的处理,在鼠标事件中常用的交互为悬浮,双击,以及右键等

操作。如果想使用ActionChains的类,首先需要导入它,导入的命令为:

from selenium.webdriver.common.action_chains import ActionChains

右键

右键使用到的方法为content_click() 的方法,下面就以百度搜索输入框为案例,来演示右键的

操作,具体实现的代码为:

from selenium.webdriver.common.action_chains import ActionChains
import time
from selenium import  webdriver
from selenium.webdriver.common.by import By

driver=webdriver.Chrome()
driver.maximize_window()
driver.get('http://www.baidu.com')
#针对ActionChains类进行实例化操作
obj=ActionChains(driver=driver)
time.sleep(3)
so=driver.find_element(By.ID,'kw')
#右键
obj.context_click(so).perform()
time.sleep(3)
driver.close()

鼠标双击

ouble_click一般主要应用于数据的交互方面,比如添加用户姓名的按钮,假设程序规定用户名称是唯一的,那么双击后是否插入了两条用户名称一样的信息了,这就需要来验证,提交数据后,然后在数据列表中使用用户名称来查询,查看是否存在两条数据,一般而言,前后端的程序员都是会处理这些的,但是作为测试我们还是需要验证这些测试场景。下面主要结合百度搜索来作为案例

from selenium.webdriver.common.action_chains import ActionChains
import time
from selenium import  webdriver
from selenium.webdriver.common.by import By

driver=webdriver.Chrome()
driver.maximize_window()
driver.get('http://www.baidu.com')
obj=ActionChains(driver=driver)
time.sleep(3)
so=driver.find_element(By.ID,'kw').send_keys('admin')
#对百度搜索按钮进行双击
button=driver.find_element(By.ID,'su')
obj.double_click(button).perform()
time.sleep(3)
driver.close()

悬浮

悬浮的交互这地方就以百度搜索的设置来案例,鼠标悬浮到设置,就会显示出下拉框的内容信息,

具体交互信息如下:

摁ctrl+f即可在代码中搜索

下面就实现这部分实现的代码

from selenium.webdriver.common.action_chains import ActionChains
import time
from selenium import  webdriver
from selenium.webdriver.common.by import By

driver=webdriver.Chrome()
driver.maximize_window()
driver.get('http://www.baidu.com')
#获取到百度设置的元素属性
obj=ActionChains(driver=driver)
settings=driver.find_element(By.XPATH,'//*[@id="s-usersetting-top"]')
#鼠标悬浮到设置按钮
obj.move_to_element(settings).perform()
time.sleep(3)
#点击搜索设置
driver.find_element(By.XPATH,'//*[@id="s-user-setting-menu"]/div/a[1]/span').click()
time.sleep(2)
#点击保存设置
driver.find_element(By.XPATH,'//*[@id="se-setting-7"]/a[2]').click()
time.sleep(2)
print(driver.switch_to.alert.text)
driver.switch_to.alert.accept()
driver.close()

Keys类

在UI的自动化测试中,有时候也会遇到键盘事件的操作,使用到的类为Keys,导入方式具体如下:

from selenium.webdriver.common.keys import Keys

常用的键盘快捷键这里不再进行详细的描述,下面还是通过具体的案例来演示这部分,涉及到的源码为:

import time
from selenium import  webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

driver=webdriver.Chrome()
driver.maximize_window()
driver.get('http://www.baidu.com/')
time.sleep(2)
so=driver.find_element(By.ID,'kw')
so.send_keys('无涯 接口测试')
time.sleep(2)
#全部选择输入的关键字
so.send_keys(Keys.CONTROL,'a')
time.sleep(2)
#然后复制
so.send_keys(Keys.CONTROL,'c')
time.sleep(2)
#然后删除
so.send_keys(Keys.BACKSPACE)
time.sleep(2)
#然后复制关键字
so.send_keys(Keys.CONTROL,'v')
time.sleep(2)
driver.close()

WebDriverWait类

在UI的自动化测试中,经常会由于网络加载慢的问题导致资源加载不出来,从而影响测试的效率,

之前我们对这样的处理方案是使用了time库里面的sleep()方法来休眠几秒钟,但是这样的方式毕竟不

是很好的解决方案。在UI自动化测试中,关于等待的部分,主要汇总为如下三点,具体如下:

1、固定等待,也就是使用sleep()方法

2、隐式等待,使用到的方法是implicitly_wait的方法,可以把它理解为设置最长等待时间

3、显式等待,主要指的是程序每隔一段时间执行自定义的程序判断条件,如果判断成立,程序就会继续执行,那么如果判断失败,就会报TimeOutExpcetion的异常信息。

WebDriverWait类分析

在UI的自动化测试中,显式等待主要使用的是类WebDriverWait,它里面提供了很多的解决方案,

下面具体对它进行分析,我们要使用它,那么我们就首先需要到人它,导入的代码具体如下:

from selenium.webdriver.support.ui import WebDriverWait

在它的源代码中,可以看到构造函数有两个形式我们需要刻意的关注,一个是driver,还有另外一个是timeout,其实driver就是webdriver实例化后的对象信息,timeout指的是具体等待的时间,单位是秒,在WebDriverWait的类里面,调用的方法具体为:

调用这个模块里面的函数以及方法后,一般会返回两种结果信息,如果是True程序就会继续执行,

如果是False那么就会报TimeOutExpxction的异常信息。

元素可见时操作

下面我们具体来看显式等待的案例应用,element_to_be_clickable是元素可见的时候进行操

作,当然相反的是元素不可见那么久无法操作,这个主要指的是资源加载出来进行具体的操作,

下面以百度搜索为案例来演示这部分,涉及到的源码为:

import time
from selenium import  webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as es
from selenium.webdriver.support.ui import WebDriverWait

driver=webdriver.Chrome()
driver.maximize_window()
driver.get('http://www.baidu.com')
driver.implicitly_wait(30)
obj=WebDriverWait(
   #调用的是元组所以要多加一个括号 
    driver=driver,timeout=10).until(method=es.element_to_be_clickable((By.ID,'kw')))
obj.send_keys('百度测试')
time.sleep(2)
driver.close()

指定元素的文本位置

这个方法主要应用于错误文本信息的验证,我们首先需要错误文本信息显示出来才能够进行断言的验证,使用到的方法为:text_to_be_present_in_element,下面我们主要是以sina email为案例来演示下这部分的具体应用,具体代码如下:

import time
from selenium import  webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as es
from selenium.webdriver.support.ui import WebDriverWait

driver=webdriver.Chrome()
driver.maximize_window()
driver.get('http://mail.sina.com.cn/#')
driver.implicitly_wait(30)
time.sleep(2)
driver.find_element(By.CLASS_NAME,'loginBtn').click()
obj=WebDriverWait(
    driver=driver,
    timeout=10).until(
    method=es.text_to_be_present_in_element((By.XPATH,'/html/body/div[1]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[7]/div[1]/a[1]'),'请输入邮箱名'))
time.sleep(2)
driver.close()

判断元素是否可见

这里以百度首页的关于百度为案例,使用到的方法为:visibilty_of_element_located,具体实现的源码为:

import time
from selenium import  webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as es
from selenium.webdriver.support.ui import WebDriverWait

driver=webdriver.Chrome()
driver.maximize_window()
driver.get('http://www.baidu.com/')
driver.implicitly_wait(30)
time.sleep(2)
obj=WebDriverWait(
    driver=driver,
    timeout=10).until(
    method=es.visibility_of_element_located((By.LINK_TEXT,'关于百度')))
print(obj.is_displayed())
obj.click()
time.sleep(2)
driver.close()

iframe框架

iframe的框架,哪些通过方式:

ID

name

索引

当前端界面有iframe框架时,是定位不到的,要先进入框架再根据XPATH进行定位,框架不在同一层级的就都是一样的索引

import time
from selenium import  webdriver
from selenium.webdriver.common.by import By

driver=webdriver.Chrome()
driver.maximize_window()
driver.get('https://file.qq.com/')
driver.implicitly_wait(30)
#进入到第一层级的iframe
driver.switch_to.frame(0)
time.sleep(0)
#进入到第二层级的iframe
driver.switch_to.frame(0)
time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="switcher_plogin"]').click()
time.sleep(3)
driver.close()

 

posted on 2022-09-15 18:14  xiaobia1  阅读(88)  评论(0)    收藏  举报