Web自动化测试——代码篇常用方法——切换
Posted 自动化测试馆长
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web自动化测试——代码篇常用方法——切换相关的知识,希望对你有一定的参考价值。
方法总览
多表单切换
当一个页面存在frame/iframe表单嵌套时,WebDriver却只能在一个页面上对元素识别定位,但是对于表单上的嵌套元素无法直接定位,这时候该怎么办呢?
Java
1 package JavaTest;
2
3 import java.util.NoSuchElementException;
4 import java.util.concurrent.TimeUnit;
5 import org.openqa.selenium.By;
6 import org.openqa.selenium.Keys;
7 import org.openqa.selenium.WebDriver;
8 import org.openqa.selenium.firefox.FirefoxDriver;
9 import org.openqa.selenium.interactions.Actions;
10 import org.openqa.selenium.support.ui.ExpectedConditions;
11 import org.openqa.selenium.support.ui.WebDriverWait;
12
13 public class Test
14 public static void main(String[] arg) throws InterruptedException
15
16 WebDriver driver = new FirefoxDriver();
17
18 // 设置隐示等待时长:10秒;
19 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
20 driver.get("file:///C:/Users/%E6%9B%B9%E5%B8%85/Desktop/iframe.html");
21
22 try
23 // 切换到id为frame1的frame
24 driver.switchTo().frame("frame1");
25
26 // 接下来获取frame1中百度元素
27 driver.findElement(By.id("kw")).sendKeys("Java");
28 driver.findElement(By.id("su")).click();
29
30 //跳回最外层页面
31 driver.switchTo().defaultContent();
32
33 // 通过元素定位frame2
34 driver.switchTo().frame(driver.findElement(By.id("frame2")));
35 driver.findElement(By.id("translateContent")).sendKeys("Java");
36
37 catch(NoSuchElementException e)
38
39 System.out.println(e.getMessage());
40
41 finally
42
43 driver.close();
44
45
46
Python
1 from selenium import webdriver
2 from selenium.webdriver.common.by import By
3 from time import *
4
5 # 启动Firefox浏览器
6 driver = webdriver.Firefox()
7
8 # 隐式等待10S,打开网址(可直接通过frame的id和name定位)
9 driver.implicitly_wait(10)
10 driver.get("file:///C:/Users/%E6%9B%B9%E5%B8%85/Desktop/iframe.html")
11
12 try:
13 # 切换到id为frame1的frame
14 driver.switch_to.frame("frame1")
15
16 # 接下来获取frame1中百度元素
17 driver.find_element(By.ID, 'kw').send_keys('Python')
18 driver.find_element(By.ID, 'su').click()
19
20 # driver.switch_to.default_content() 跳回最外层页面
21 # 跳出当前一级表单
22 driver.switch_to.parent_frame()
23
24 # 通过元素定位frame2
25 element = driver.find_element(By.ID, 'frame2')
26 driver.switch_to.frame(element)
27 driver.find_element(By.ID, 'translateContent').send_keys('Python')
28 except Exception as e:
29 print(e.args[0])
30 finally:
31 driver.close()
Ruby
1 class Baidu
2 require 'rubygems'
3 require 'selenium-webdriver'
4
5 # 打开firefox并输入网址
6 driver = Selenium::WebDriver.for :firefox
7
8 # 设置隐式等待时间10S
9 driver.manage.timeouts.implicit_wait = 10
10 driver.navigate.to "file:///C:/Users/%E6%9B%B9%E5%B8%85/Desktop/iframe.html"
11
12 begin
13 # 切换到id为frame1的frame
14 driver.switch_to.frame('frame1')
15
16 # 接下来获取frame1中百度元素
17 driver.find_element(:id => 'kw').send_keys('Ruby')
18 driver.find_element(:id => 'su').click
19
20 # 跳出当前一级表单
21 driver.switch_to.parent_frame
22
23 # 通过元素定位frame2
24 driver.switch_to.frame(driver.find_element(:id => "frame2"))
25 driver.find_element(:id => 'translateContent').send_keys('Ruby')
26 rescue => e
27 puts e.message # 显示报错信息
28 ensure
29 driver.close
30 end
31 end
多窗体切换
当我们点击某个链接时,弹出了新的窗体,这时候我们要在不同的窗体上进行操作又该怎么切换呢?
Java
1 package JavaTest;
2
3 import java.util.ArrayList;
4 import java.util.NoSuchElementException;
5 import java.util.Set;
6 import java.util.concurrent.TimeUnit;
7 import org.openqa.selenium.By;
8 import org.openqa.selenium.WebDriver;
9 import org.openqa.selenium.firefox.FirefoxDriver;
10
11 public class Test
12 public static void main(String[] arg) throws InterruptedException
13
14 WebDriver driver = new FirefoxDriver();
15
16 // 设置隐示等待时长:10秒;
17 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
18 driver.get("http://www.baidu.com");
19
20 try
21 driver.findElement(By.xpath("//*[@id='u1']/a[7]")).click(); // 点击百度登录按钮
22 driver.findElement(By.xpath("//*[@id='passport-login-pop-dialog']/div/div/div/div[4]/a")).click(); // 进入注册页面
23 driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_10__footerULoginBtn']")).click(); //点击用户登陆
24 driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_10__submitWrapper']/a[1]")).click(); //进入忘记密码页面
25
26 // 获取当前所有打开的窗口的句柄
27 Set<String> winHandels = driver.getWindowHandles();
28 ArrayList<String> windows = new ArrayList<String>(winHandels);
29
30 driver.switchTo().window(windows.get(2)); // 切换到注册页面
31 System.out.println(driver.getCurrentUrl());
32 driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_3__userName']")).sendKeys("1234567890"); //输入设置用户名
33 driver.close(); //关闭注册页面
34 driver.switchTo().window(windows.get(0)); //切换到主页
35 driver.close(); //关闭主页
36 driver.switchTo().window(windows.get(1));//切换到忘记密码页面
37
38 catch(NoSuchElementException e)
39
40 System.out.println(e.getMessage());
41
42 finally
43
44 driver.close();
45
46
47
Python
1 from selenium import webdriver
2 from selenium.webdriver.common.by import By
3
4 # 启动Firefox浏览器
5 driver = webdriver.Firefox()
6
7 # 隐式等待10S,打开网址(可直接通过frame的id和name定位)
8 driver.implicitly_wait(10)
9 driver.get("http://www.baidu.com")
10
11 try:
12 driver.find_element(By.XPATH, "//*[@id='u1']/a[7]").click() # 点击百度登录按钮
13 driver.find_element(By.XPATH, "//*[@id='passport-login-pop-dialog']/div/div/div/div[4]/a").click() # 进入注册页面
14 driver.find_element(By.XPATH, "//*[@id='TANGRAM__PSP_10__footerULoginBtn']").click() # 点击用户登陆
15 driver.find_element(By.XPATH, "//*[@id='TANGRAM__PSP_10__submitWrapper']/a[1]").click() # 进入忘记密码页面
16
17 # 获取当前所有打开的窗口的句柄
18 windows = driver.window_handles
19
20 driver.switch_to.window(windows[-1]) # 切换到注册页面
21 driver.find_element(By.XPATH, "//*[@id='TANGRAM__PSP_3__userName']").send_keys('1234567890') # 输入设置用户名
22 driver.close() # 关闭注册窗体
23 driver.switch_to.window(windows[0]) # 切换到主页
24 driver.close() # 关闭主页
25 driver.switch_to.window(windows[1]) # 切换到忘记密码页面
26 except Exception as e:
27 print(e.args[0])
28 finally:
29 driver.close()
Ruby
1 class Baidu
2 require 'rubygems'
3 require 'selenium-webdriver'
4
5 # 打开firefox并输入网址
6 driver = Selenium::WebDriver.for :firefox
7
8 # 设置隐式等待时间10S
9 driver.manage.timeouts.implicit_wait = 10
10 driver.navigate.to "http://www.baidu.com"
11
12 begin
13 driver.find_element(:xpath => "//*[@id='u1']/a[7]").click # 点击百度登录按钮
14 driver.find_element(:xpath => "//*[@id='passport-login-pop-dialog']/div/div/div/div[4]/a").click # 进入注册页面
15 driver.find_element(:xpath => "//*[@id='TANGRAM__PSP_10__footerULoginBtn']").click # 点击用户登陆
16 driver.find_element(:xpath => "//*[@id='TANGRAM__PSP_10__submitWrapper']/a[1]").click # 进入忘记密码页面
17
18 # 获取当前所有打开的窗口的句柄
19 windows = driver.window_handles
20
21 driver.switch_to.window(windows[-1]) # 切换到注册页面(2/-1)
22 driver.find_element(:xpath => "//*[@id='TANGRAM__PSP_3__userName']").send_keys('1234567890') # 输入设置用户名
23 driver.close # 关闭注册窗体
24 driver.switch_to.window(windows[0]) # 切换到注册页面
25 driver.close # 关闭主页
26 driver.switch_to.window(windows[1]) # 切换到忘记密码页面
27 rescue => e
28 puts e.message # 显示报错信息
29 ensure
30 driver.close
31 end
32 end
警告框
为什么要把警告框放在这里呢?我们把页面想象成一个画布,我们在当前的画布层进行操作,弹出的警告框就像是画布的顶层。我们要切换到“画布”顶层将其处理才可进行后续操作。
Java
package JavaTest;
import java.util.NoSuchElementException;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class Test
public static void main(String[] arg) throws InterruptedException
WebDriver driver = new FirefoxDriver();
// 设置隐示等待时长:10秒;
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("file:///C:/Users/%E6%9B%B9%E5%B8%85/Desktop/alert.html");
try
driver.findElement(By.xpath("//*[@id='btn']")).click();//点击"点我一下"按钮
driver.switchTo().alert().accept();;//接受现有警告框
catch(NoSuchElementException e)
System.out.println(e.getMessage());
finally
driver.close();
Python
问题一:
采用代码:driver.switch_to.alert().accept() # 接受现有警告框
报错提示:‘Alert’ object is not callable
解决方法:
对象不能用函数形式调用,就是不能callable。
更换代码:driver.switch_to_alert().accept() # 接受现有警告框
问题二:
try:
driver.find_element(By.XPATH, "//*[@id='btn']").click() # 点击"点我一下"按钮
print(driver.switch_to_alert().text) # 接受现有警告框
except Exception as e:
print(e.args[0])
finally:
driver.close()
解决方法:
driver.close()用来关闭当前窗体,driver.quit()用来退出相关驱动程序和关闭所有窗口。
目前我们仍然处于alert,close()无法适用。要么先将alert进行接受处理后用close()方法,要么直接采用quit()退出驱动。
1 from selenium import webdriver
2 from selenium.webdriver.common.by import By
3
4 # 启动Firefox浏览器
5 driver = webdriver.Firefox()
6
7 # 隐式等待10S,打开网址(可直接通过frame的id和name定位)
8 driver.implicitly_wait(10)
9 driver.get("file:///C:/Users/%E6%9B%B9%E5%B8%85/Desktop/alert.html")
10
11 try:
12 driver.find_element(By.XPATH, "//*[@id='btn']").click() # 点击"点我一下"按钮
13 driver.switch_to_alert().accept() # 接受现有警告框
14 except Exception as e:
15 print(e.args[0])
16 finally:
17 driver.quit()
Ruby
1 class Baidu
2 require 'rubygems'
3 require 'selenium-webdriver'
4
5 # 打开firefox并输入网址
6 driver = Selenium::WebDriver.for :firefox
7
8 # 设置隐式等待时间10S
9 driver.manage.timeouts.implicit_wait = 10
10 driver.navigate.to "file:///C:/Users/%E6%9B%B9%E5%B8%85/Desktop/alert.html"
11
12 begin
13 driver.find_element(:xpath => "//*[@id='btn']").click # 点击"点我一下"按钮
14 puts driver.switch_to.alert.text # 显示警告框文本
15 driver.switch_to.alert.accept # 接受现有警告框
16 rescue => e
17 puts e.message # 显示报错信息
18 ensure
19 driver.close
20 end
21 end
最后:下方这份完整的【软件测试】视频学习教程已经整理上传完成,朋友们如果需要可以自行免费领取 【保证100%免费】
以上是关于Web自动化测试——代码篇常用方法——切换的主要内容,如果未能解决你的问题,请参考以下文章