【Web自動化測試——代碼篇七】經常使用方法——切換

方法總覽

  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卻只能在一個頁面上對元素識別定位,可是對於表單上的嵌套元素沒法直接定位,這時候該怎麼辦呢?html

圖片.png

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

圖片.png

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

警告框

        爲何要把警告框放在這裏呢?咱們把頁面想象成一個畫布,咱們在當前的畫布層進行操做,彈出的警告框就像是畫布的頂層。咱們要切換到「畫布」頂層將其處理纔可進行後續操做。web

圖片.png
 

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


問題一:windows

採用代碼:driver.switch_to.alert().accept() # 接受現有警告框
報錯提示:‘Alert’ object is not callable
解決方法:
對象不能用函數形式調用,就是不能callable。
更換代碼:driver.switch_to_alert().accept() # 接受現有警告框瀏覽器

問題二:ruby

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()

圖片.png
解決方法:
driver.close()用來關閉當前窗體,driver.quit()用來退出相關驅動程序和關閉全部窗口。
目前咱們仍然處於alert,close()沒法適用。要麼先將alert進行接受處理後用close()方法,要麼直接採用quit()退出驅動。app

 

 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
相關文章
相關標籤/搜索