方法总览
Java | Python | Ruby | ||
多表单切换 | 指定表单 | switchTo().frame(id/name/定位元素) | switch_to.frame(id/name/定位元素) | switch_to.frame(id/name/定位元素) |
上一级表单 | switchTo().parentFrame() | switch_to.parent_content() | switch_to.parent_frame | |
最外层页面 | switchTo().defaultContent() | switch_to.default_content() | switch_to.default_content | |
多窗体切换 | 指定窗体 | switchTo().window(指定窗体) | switch_to.window(指定窗体) | switch_to.window(指定窗体) |
获取当前窗体句柄 | getWindowHandle() | current_window_handle | window_handle | |
获取所有窗体句柄 | getWindowHandles() | window_handles | window_handles | |
警告框 | 定位警告框 | switchTo().alert() - getText():返回文字信息 - accept():接受现有警告框 - dismiss():解散现有警告框 - sendKeys():发送文本至警告框 ? | switch_to_alert() - text:返回文字信息 - accept():接受现有警告框 - dismiss():解散现有警告框 - send_keys():发送文本至警告框 ? | switch_to.alert - text:返回文字信息 - accept:接受现有警告框 - dismiss:解散现有警告框 - send_keys():发送文本至警告框 ? |
多表单切换
当一个页面存在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 InterruptedException15 ????{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的frame24 ????????????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 ?????????????// 通过元素定位frame234 ????????????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 ????????finally42 ????????{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的frame14 ????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 ????# 通过元素定位frame225 ????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 = 1010 ??driver.navigate.to "file:///C:/Users/%E6%9B%B9%E5%B8%85/Desktop/iframe.html"11 12 ??begin13 ????# 切换到id为frame1的frame14 ????driver.switch_to.frame(‘frame1‘)15 16 ????# 接下来获取frame1中百度元素17 ????driver.find_element(:id => ‘kw‘).send_keys(‘Ruby‘)18 ????driver.find_element(:id => ‘su‘).click19 20 ????# 跳出当前一级表单21 ????driver.switch_to.parent_frame22 23 ????# 通过元素定位frame224 ????driver.switch_to.frame(driver.find_element(:id => "frame2"))25 ????driver.find_element(:id => ‘translateContent‘).send_keys(‘Ruby‘)26 ??rescue => e27 ????puts e.message # 显示报错信息28 ??ensure29 ????driver.close30 ??end31 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 InterruptedException13 ????{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 ????????finally43 ????????{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_handles19 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 = 1010 ??driver.navigate.to "http://www.baidu.com"11 12 ??begin13 ????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_handles20 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 => e28 ????puts e.message # 显示报错信息29 ??ensure30 ????driver.close31 ??end32 end
警告框
为什么要把警告框放在这里呢?我们把页面想象成一个画布,我们在当前的画布层进行操作,弹出的警告框就像是画布的顶层。我们要切换到“画布”顶层将其处理才可进行后续操作。
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.WebDriver; 7 import org.openqa.selenium.firefox.FirefoxDriver; 8 ?9 public class Test {10 ????public static void main(String[] arg) throws InterruptedException11 ????{12 ????????WebDriver driver = new FirefoxDriver();13 14 ?????????// 设置隐示等待时长:10秒;15 ????????driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);16 ????????driver.get("file:///C:/Users/%E6%9B%B9%E5%B8%85/Desktop/alert.html"); ???17 ????????18 ????????try {19 ????????????driver.findElement(By.xpath("//*[@id=‘btn‘]")).click();//点击"点我一下"按钮20 ????????????driver.switchTo().alert().accept();;//接受现有警告框21 ????????}22 ????????catch(NoSuchElementException e)23 ????????{24 ????????????System.out.println(e.getMessage());25 ????????}26 ????????finally27 ????????{28 ????????????driver.close();29 ????????} ???30 ????}31 }
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 = 1010 ??driver.navigate.to "file:///C:/Users/%E6%9B%B9%E5%B8%85/Desktop/alert.html"11 12 ??begin13 ????driver.find_element(:xpath => "//*[@id=‘btn‘]").click ??# 点击"点我一下"按钮14 ????puts driver.switch_to.alert.text # 显示警告框文本15 ????driver.switch_to.alert.accept # 接受现有警告框16 ??rescue => e17 ????puts e.message # 显示报错信息18 ??ensure19 ????driver.close20 ??end21 end
【Web自动化测试——代码篇七】常用方法——切换
原文地址:https://www.cnblogs.com/CSgarcia/p/9413909.html