selenium3+python自動化7-switch_to總結 (2020-02-14 17:35)


一、前言

這次主要整理一下最近遇到過跟switch_to有關的內容,包含切窗口、切框架、切彈框。將相同的知識點放在一起方便后期查閱和管理,后續若遇到新的內容便繼續更新。

二、多窗口、句柄(handle)的切換

1.點擊某個元素后,會打開一個新的窗口,多個窗口之間如何切換?

2.瀏覽器窗口的屬性用句柄(handle)來識別,

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

獲取所有的句柄:driver.window_handles ,所有句柄是一個list列表,如果要切換到具體的窗口使用索引值即可,每打開一個新窗口,索引值就增加一個,先打開的窗口索引值為0。

3.切換句柄:driver.switch_to.window(所有句柄[索引值])

例如:獲取所有句柄:handles=driver.window_handles

   切換至第一個窗口:driver.switch_to.window(handles[0])

   切換至第二個窗口:driver.switch_to.window(handles[1]).

4.檢驗切換窗口是否正確,切換窗口后可以打印title看與預期是否一致。打印title用print(driver.title)

5.以注冊百度賬號為例,打開百度——點擊“登錄”,出現二維碼——點擊二維碼下面的“立即注冊”——打開一個新的窗口:注冊窗口

from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.baidu.com/")
driver.implicitly_wait(10)
driver.find_element_by_link_text("登錄").click()
sleep(1)
driver.find_element_by_link_text("立即注冊").click()
sleep(1)
#獲取當前句柄並打印
handle=driver.current_window_handle
print(handle)
#獲取所有句柄並打印
handles=driver.window_handles
print(handles,type(handles),len(handles))
#切換句柄
driver.switch_to.window(handles[0])
print(driver.title)#獲取切換后的title值進行檢驗
driver.quit()

運行結果:

 二、切框架(iframe/frame)

1.frame標簽有frameset、frame、iframe三種,frameset跟其他普通標簽沒有區別,不會影響到正常的定位,而frame與iframe對selenium定位而言是一樣的,selenium有一組方法對frame進行操作。(補充內容20200217)frame是整個頁面的框架,iframe是內嵌的頁面元素。

2.iframe的切換默認是id和name,若沒有就需要先定位到iframe再進行切換。總之:有id或者name就直接切換,沒有就先定位再切換。

3.切換框架:driver.switch_to.frame(id/name/定位到的iframe)

 切至主框架:driver.switch_to.default_content()

 切至父框架:driver.switch_to.parent_frame()

注意:有多級框架時,框架必須一級一級往下切換,不可逐級。

      換框架的時候必須切換至主框架或者父框架再進入新的框架,不能在上一個框架基礎上直接切換至新的框架。

4.實際應用(補充內容20200217)

目標:將“55”鏈接內容中的“附言”打印出來。①打開標題為“55”的鏈接,定位“55”鏈接發現在多個框架中,frameset無需切換。其余框架需逐級切換。②“附言”在另一個多級框架中,牽扯換框架。第一個框架沒有id/name,又牽扯到框架定位。

代碼如下:

from selenium import webdriver
from time import sleep
driver=webdriver.Chrome()
driver.get("http://localhost:8080/oa/login.jsp")
driver.implicitly_wait(10)
#登錄
elements=driver.find_elements_by_class_name('loginInput')
elements[0].send_keys("xxx")
elements[1].send_keys("xxxxx")
driver.find_element_by_id("button_submit").click()
sleep(3)
#在已發事項中打開“55”鏈接
driver.find_element_by_link_text("已發事項").click()
driver.switch_to.frame('iframe_main')
# driver.switch_to.frame('listFrameSet')#frameset框架不用切換,否則報錯
driver.switch_to.frame('listframe')
driver.find_element_by_xpath('//*[@id="__gt_FGrid_r_4281581329959307847"]/td[3]/div/a').click()
sleep(3)
#打開鏈接后打印“附言”,涉及換框架
driver.switch_to.default_content()
iframe=driver.find_element_by_xpath('//*[contains(@src,"/oa/jsp/collaborate/view/index.jsp?viewType=view&uuid=")]')
driver.switch_to.frame(iframe)
driver.switch_to.frame('iframe_content')
fuyan=driver.find_element_by_xpath('//*[@id="descriptionDiv"]/div[2]')
print(fuyan.text)
driver.quit()

三、切彈框(alert/confim/prompt)

1.認識alert/confim/prompt彈框的樣式。借助園主的代碼,如下代碼復制至記事本中,將記事本后綴改為.html,用瀏覽器打開即可觀察每種彈框樣式。

<html>

<head>

<title>Alert</title>

</head>

<body>

<input id = "alert" value = "alert" type = "button" onclick = "alert('您關注了yoyoketang嗎?');"/>

<input id = "confirm" value = "confirm" type = "button" onclick = "confirm('確定關注微信公眾號:yoyoketang?');"/>

<input id = "prompt" value = "prompt" type = "button" onclick = "var name = prompt('請輸入微信公眾號:','yoyoketang'); document.write(name) "/>

</body>

</html>

2.三種彈框操作方法:

  • text:獲取文本值
  • accept():點擊“確認”
  • dismiss():點擊“取消”或者關閉對話框
  • send_keys():輸入值--僅限prompt,在alert和confirm上沒有輸入框

3.切彈框:先找到彈框的觸發按鈕點擊操作,再切入彈框中,進行上述操作方法。

切彈框:driver.switch_to.alert

4.實戰

4.1以上面給出的源代碼為例,進行練習。

from selenium import webdriver
from time import sleep
driver=webdriver.Chrome()
driver.get('C:\\Users\\張全\Desktop\\tankuang.html')
driver.implicitly_wait(10)
#1 alert彈框 driver.find_element_by_id("alert").click() t1=driver.switch_to.alert print(t1.text) t1.accept() # t1.dismiss() sleep(2)
#2 confirm彈框 driver.find_element_by_id("confirm").click() t2=driver.switch_to.alert print(t2.text) t2.accept() # t2.dismiss() sleep(2)
#3 prompt彈框 driver.find_element_by_id("prompt").click() t3=driver.switch_to.alert print(t3.text) t3.send_keys("") t3.accept() # t3.dismiss() sleep(2) driver.quit()

運行結果:

4.2以百度設置每頁演示頁數為例:打開百度,點擊“設置”——點擊“搜索設置”——設置每頁顯示條數——點擊“保存設置”便出現一個彈框。

from time import sleep
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.baidu.com/")
driver.implicitly_wait(10)
#3 鼠標操作-百度設置按鈕
from selenium.webdriver.common.action_chains import ActionChains
shezhi=driver.find_element_by_link_text("設置")
ActionChains(driver).move_to_element(shezhi).perform()
sleep(1)
driver.find_element_by_xpath('//*[@class="bdpfmenu"]/a[1]').click()#點擊搜索設置
sleep(1)
#4 select下拉框-設置頁中頁碼顯示設置(接3代碼)
#4.1二次定位:先定位下拉框,再定位選項
# s=driver.find_element_by_id('nr')
# s.find_element_by_xpath('//option[@value="20"]').click()
# 4.2直接定位選項
# driver.find_element_by_xpath('//*[@id="nr"]/option[3]').click()
#4.3 select模塊
from selenium.webdriver.support.select import Select
s=driver.find_element_by_id("nr")
Select(s).select_by_index(1)
sleep(1)
Select(s).select_by_value("50")
sleep(1)
Select(s).select_by_visible_text("每頁顯示20條")
sleep(1)
driver.find_element_by_link_text("保存設置").click()
sleep(1)
#5 切彈框(接4代碼)
t=driver.switch_to.alert
print(t.text)#打印彈框文本
# t.accept()#確認對話框
t.dismiss()#取消或關閉對話框
sleep(3)
driver.quit()

參考博客:https://www.cnblogs.com/yoyoketang/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM