午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

UI自動化測試之selenium工具(瀏覽器窗口的切換)

 福兮007 2023-10-22 發(fā)布于上海

前言

1、在瀏覽網(wǎng)頁的時候,有時點擊一個鏈接或者按鈕,會彈出一個新的窗口。這類窗口也被稱之為句柄(一個瀏覽器窗口的唯一標識符,通過句柄實現(xiàn)不同瀏覽器窗口之間的切換),在我們手動控制瀏覽器的時候,產(chǎn)生新的句柄時瀏覽器會自動的幫我們跳轉到最新的句柄處(鼠標聚焦于最新打開的瀏覽器窗口)。

2、在UI自動化的過程中,代碼并不會默認自動的跳轉到最新的句柄處,需要代碼去切換句柄也就是切換瀏覽器窗口。

3、使用Selenium工具進行 Web UI自動化測試,如果彈出新窗口時,沒有對窗口進行切換,那么,WebDriver 對象 的焦點對應的,依然是舊窗口,后續(xù)的自動化操作,將繼續(xù)在舊窗口中進行。所以我們需要使用代碼來切換瀏覽器窗口。

方法

獲取當前瀏覽器的所有窗口句柄

handles=driver.window_handles  # 返回值是一個列表

解釋: WebDriver 對象 中有  window_handles 屬性 ,返回一個列表,里面記錄了當前瀏覽器所有的窗口句柄。【句柄:;瀏覽器對應窗口的 id】

②切換到最開始打開的窗口

driver.switch_to.window(handles[0])

解釋:如果UI自動化操作的瀏覽器打開了多個窗口,那么獲取到的列表的最后一個元素即為最新的瀏覽器窗口句柄。

③切換到最新打開的窗口

driver.switch_to.window(handles[-1])

④切換到倒數(shù)第二個打開的窗口

driver.switch_to.window(handles[-2])

⑤獲取 WebDriver 對象 當前聚焦的瀏覽器窗口句柄

driver.current_window_handle() 

⑥驗證 WebDriver 對象 的焦點是否聚焦在最新打開的瀏覽器窗口

  1. # **先看下當前窗口url地址:**
  2. print(self.browser.current_url)
  3. # 打印所有的窗口 ['窗口ID1', '窗口ID2', '窗口ID3'] ==> 窗口句柄
  4. windows = self.browser.window_handles
  5. print(windows)
  6. # 1 切換到最后的窗口
  7. driver.switch_to.window(drivers[-1])
  8. # 切換到最后的窗口后,打印下url,核對下是不是最后的窗口
  9. print(driver.current_url)
  10. 2 切換到第二個窗口
  11. # 先獲取現(xiàn)在的窗口
  12. current_window = self.browser.current_window_handle
  13. # 獲取第二個窗口的索引(由當前窗口索引+1)
  14. next_window_index = windows.index(current_window) + 1
  15. # 切換到第二個窗口
  16. self.browser.switch_to.window(windows[next_window_index])

 

⑦selenium工具瀏覽器窗口句柄切換API

實例

①示例1

1、手動操作瀏覽器打開打開趕集網(wǎng):http://bj.ganji.com/,點擊招聘求職按鈕會發(fā)現(xiàn)右邊多了一個窗口標簽。

2、當我們用代碼去執(zhí)行點擊的時候,發(fā)現(xiàn)界面上出現(xiàn)兩個窗口,如下圖這種情況就是瀏覽器的多窗口了。

【注意】:手動操作瀏覽器時呈現(xiàn)的效果是兩個標簽,而腳本執(zhí)行時卻出現(xiàn)了兩個頁面的原因:(默認腳本執(zhí)行是不加載任何配置的)【手工點擊是在瀏覽器中瀏覽器默認設置了新窗口打開方式為標簽,而瀏覽器中的默認打開新窗口的方式為出現(xiàn)一個新頁面】

3、獲取當前瀏覽器的窗口句柄

①元素有屬性,瀏覽器的窗口其實也有屬性的,只是你看不到,瀏覽器窗口的屬性用句柄(handle)來識別。

②人為操作的話,可以通過眼睛看,識別不同的窗口點擊切換。但是腳本沒長眼睛,它不知道你要操作哪個窗口,這時候只能句柄來判斷了。

③獲取當前頁面的句柄方法: driver.current_window_handle 

4、獲取所有的瀏覽器句柄

①定位趕集網(wǎng)招聘求職按鈕,并點擊

②點擊后,獲取當前所以的句柄: driver.window_handles 

 

5、切換句柄

方法一:

    1.循環(huán)判斷是否與首頁句柄相等。

    2.如果不等,說明是新頁面的句柄。

    3.獲取的新頁面句柄后,可以切換到新打開的頁面上。

    4.打印新頁面的title或者url,看瀏覽器窗口是否切換成功。

方法二:

直接在獲取到的瀏覽器句柄列表中取最后一個元素,然后代碼中切換到這個句柄id。

6、關閉新窗口,切回主頁 

    1.打開新頁面后,其實只想驗證新頁面跳轉對不對,這里可以做個簡單的驗證,獲取當前頁面的title驗證

    2.驗證完后切關閉新窗口

    3.切回句柄到首頁

    4.打印當前頁面的句柄,看是否切換到首頁了

 ②示例2

  1. #coding = utf-8
  2. import unittest
  3. from selenium import webdriver
  4. from time import sleep
  5. from selenium.webdriver.common.action_chains import ActionChains
  6. class Truelogin(unittest.TestCase):
  7. @classmethod
  8. def setUpClass(cls):
  9. print("***開始進行登錄***")
  10. def setUp(self):
  11. # 屏蔽自動化受控提示 && 開發(fā)者提示
  12. self.option = webdriver.ChromeOptions()
  13. self.option.add_experimental_option("excludeSwitches", ['enable-automation', 'load-extension'])
  14. # 屏蔽'保存密碼'提示框
  15. self.prefs = {}
  16. self.prefs["credentials_enable_service"] = False
  17. self.prefs["profile.password_manager_enabled"] = False
  18. self.option.add_experimental_option("prefs", self.prefs)
  19. # 打開谷歌瀏覽器
  20. self.driver = webdriver.Chrome(options=self.option)
  21. # 窗口最大化
  22. self.driver.maximize_window()
  23. sleep(5)
  24. #打開登錄界面
  25. self.driver.get("ur")
  26. sleep(5)
  27. def testcloudAIlogin(self):
  28. self.driver.switch_to.frame(0)
  29. self.driver.find_element_by_xpath("http://input[@id='username']").send_keys("用戶名")
  30. self.driver.find_element_by_xpath("http://input[@id='password']").send_keys("密碼*")
  31. self.driver.find_element_by_xpath("http://div[@class='button']/a[@id='loginbtn']").click()
  32. sleep(5)
  33. # 獲取當前窗口的句柄
  34. self.window1 = self.driver.current_window_handle
  35. #搜索框輸入系統(tǒng)名稱
  36. self.driver.find_element_by_css_selector("input#search-keyword").send_keys("名稱")
  37. sleep(2)
  38. ActionChains(self.driver).move_to_element(self.driver.find_element_by_xpath("http://a/span[text()='名稱']")).perform()
  39. self.driver.find_element_by_xpath("http://a/span[text()='名稱']").click()
  40. sleep(10)
  41. # 獲取所有窗口的句柄
  42. self.all_handles = self.driver.window_handles
  43. sleep(5)
  44. #切換到新窗口
  45. for self.handle in self.all_handles:
  46. if self.handle != self.window1:
  47. self.driver._switch_to.window(self.handle)
  48. print("***這是新窗口***")
  49. sleep(2)
  50. self.assertEqual("用戶名",self.driver.find_element_by_xpath("http://div[text()='用戶名']").text)
  51. sleep(2)
  52. print("***登錄完成***")
  53. def tearDown(self):
  54. self.driver.quit()
  55. print("***測試用例結束***")
  56. @classmethod
  57. def tearDownClass(cls):
  58. print("***一次測試結束***")
  59. if __name__ == '__main__':
  60. unittest.main()

附加知識

在web頁面上經(jīng)常有點擊一個頁面后,另外打開一個新窗口,是因為html中 a標簽 的 target屬性 是 _bank 。

在HTML中a標簽target屬性目標的四個參數(shù)的用法:

  1. 1、target="_self"表示:將鏈接的畫面內(nèi)容,顯示在目前的視窗中。(內(nèi)定值) 。 即:同窗口打開。
  2. 2、target="_parent"表示:將鏈接的畫面內(nèi)容,當成文件的上一個畫面。即:當前窗口打開。
  3. 3、target="_top"表示:將框架中鏈接的畫面內(nèi)容,顯示在沒有框架的視窗中(即除去了框架)。即:頂端打開窗口。
  4. 4、target="_blank"表示:將鏈接的畫面內(nèi)容,在新的瀏覽視窗中打開。即:打開新窗口。
  5. 注意:當網(wǎng)頁沒有框架時,target="_self"和target="_parent"以及target="_top"三種方式的顯示方式幾乎相同。

 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多