【Web自動化測試——代碼篇七】常用方法——切換
阿新 • • 發佈:2018-08-28
final src fire desktop sta begin 新的 med 目前
方法總覽
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 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
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 InterruptedException 11 { 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 finally 27 { 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 = 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
【Web自動化測試——代碼篇七】常用方法——切換