9 - selenium 常見元素操作:三大切換--瀏覽器窗口切換、iframe 窗口切換、alert彈窗切換


selenium 常見元素操作

  • 三大等待
  • 三大切換(iframe,window,alert)
  • 下拉列表
  • 鼠標和鍵盤
  • js+ dom應用()
  • 上傳操作

 

瀏覽器窗口切換:

第一種:需要兩步

1.獲取當前打開的所有窗口;window_handles(譯:文斗.憨豆思)

2.切換到新窗口;switch_to.window(wins[-1])(譯:思維吃.圖.文斗.文字)

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver
import time

driver = webdriver.Chrome()     # 打開谷歌瀏覽器
driver.maximize_window()        # 窗口最大化
driver.get("https://www.baidu.com/")    # 訪問百度首頁

driver.find_element_by_id("kw").send_keys("檸檬班")    # 定位輸入框,send_keys輸入內容
driver.find_element_by_id("su").click()     # 定位 百度一下 查詢按鈕,進行點擊click

# 查詢時需要等待
loc = (By.XPATH, '//a[text()="_騰訊課堂"]')     # 需要等待的元素,進行定位
WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc))      # 等待上線為20秒,直到等待元素出現
driver.find_element(*loc).click()  # 點擊操作,會打開新窗口;* 代表拆包,find_element需要傳入定位類型,和表達式

time.sleep(2)       # 等待窗口出現,切換到新的窗口,在新窗口去操作元素。

# 1.獲取當前打開的所有窗口,沒打開一個窗口都有一個新的句柄handles。--- 窗口列表window_handles
wins = driver.window_handles
print(wins)                             # 打印當前所有窗口的句柄
print(driver.current_window_handle)     # 打印當前窗口的句柄

# 2.切換的語句,切換到你想操作元素所在的窗口;進入到了新的html頁面-新的窗口為最后一個wins[-1]
driver.switch_to.window(wins[-1])

# 3、在新的頁面當中,找元素,並操作 loc
= (By.XPATH, '//ul[@id="js-tab"]//h2[contains(text(),"老師")]') # 在新頁面當中進行操作,等待的定位元素 WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc)) # 等待元素可見visibility_of_element_located driver.find_element(*loc).click() # 元素出現后進行操作 print(driver.current_window_handle) # 打印當前操作窗口句柄與上面一致 time.sleep(5) # 強制等待5秒 driver.quit() # 關閉瀏覽器

 

第二種騷操作:這種更穩定;需要四步

1.操作之前獲取窗口總數1;window_handles      (譯:文斗.憨豆思)

2.EC條件等待新窗口出現;new_window_is_opened       (譯:牛.文斗.意思.歐噴的)

3.獲取當前打開的所有窗口總數2;window_handles        (譯:文斗.憨豆思)

4.切換到新窗口;switch_to.window(wins[-1])           (譯:思維吃.圖.文斗(蚊子))

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver
import time

driver = webdriver.Chrome()     # 打開谷歌瀏覽器
driver.maximize_window()        # 窗口最大化
driver.get("https://www.baidu.com/")    # 訪問百度首頁

driver.find_element_by_id("kw").send_keys("檸檬班")    # 定位輸入框,send_keys輸入內容
driver.find_element_by_id("su").click()     # 定位 百度一下 查詢按鈕,進行點擊click

# 查詢時需要等待
loc = (By.XPATH, '//a[text()="_騰訊課堂"]')     # 需要等待的元素,進行定位
WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc))      # 等待上線為20秒,直到等待元素出現

# 1.點擊操作之前的窗口,總數  1
cur_handles = driver.window_handles
driver.find_element(*loc).click()       # 點擊操作,會打開新窗口

# 2.EC條件:等待新窗口出現進行對比---確定新窗口個數比以前窗口多 new_window_is_opened 類
# 將打開一個新窗口,並具有增加窗口句柄;比窗口數大小
# 在打開新窗口后獲取句柄的句柄總數與傳進來的窗口數多,返回Turn 說明新窗口出現
WebDriverWait(driver, 20).until(EC.new_window_is_opened(cur_handles)) # 3.獲取當前打開的所有窗口。總數 2 --- 窗口列表window_handles wins = driver.window_handles print(wins) # 打印當前所有窗口的句柄 print(driver.current_window_handle) # 打印當前窗口的句柄 # 4.切換的語句,切換到你想操作元素所在的窗口;進入到了新的html頁面-新的窗口為最后一個wins[-1] driver.switch_to.window(wins[-1]) loc = (By.XPATH, '//ul[@id="js-tab"]//h2[contains(text(),"老師")]') # 在新頁面當中進行操作,等待的定位元素 WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc)) # 等待元素可見visibility_of_element_located driver.find_element(*loc).click() # 元素出現后進行操作 print(driver.current_window_handle) # 打印當前操作窗口句柄與上面一致 time.sleep(5) # 強制等待5秒 driver.quit() # 關閉瀏覽器

 

iframe (多層HTML頁面)窗口切換

  • iframe - 頁面元素(容器) - 里面放的就是html
  • 切換的條件:
    • 如果你要操作的元素,在iframe當中,你才需要切換。    
  • 1、判斷你要操作的元素,是否在iframe當中?
    • 得找到 iframe,才能切換到iframe當中。再去操作里面的html  
  • 2、切換:從一個html 切換到另外一個 html。

iframe(譯:哎服潤么)切換,兩種方式,七中方法

方式一:支持三種方法;driver.switch_to.frame(切換方法)  (譯:思維吃.服潤么)

切換三種方法切換:下標切換、name名字屬性切換、webelement對象切換

方式二:更加穩定,支持四種

騷操作: EC條件 - 條件:等待iframe有效並切換到iframe當中。

EC(譯:一科四盤課題的.肯迪深思)模塊中的 frame_to_be_available_and_switch_to_it(譯:福軟木.圖.比.額為類bou.按得.思維吃.圖.易特)判斷方法

支持四種方法切換:下標切換、name名字屬性切換、webelement對象切換、元素定位元組

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC    # (譯:一科四盤課題的.肯迪深思)
from selenium.webdriver.common.by import By
import time

# 打開瀏覽器
driver = webdriver.Chrome()
# 訪問騰訊課堂頁面
driver.get("http://www.baidu.com")
# 窗口最大化
driver.maximize_window()

# 定位輸入框,輸入
driver.find_element_by_id('kw').send_keys("騰訊課堂")       # 定位輸入框,輸入
# 查詢按鈕定位,進行點擊操作click
driver.find_element_by_id("su").click()         # 查詢按鈕定位,進行點擊操作click

# 查詢時需要等待
# 需要等待的元素,進行定位
loc_1 = (By.XPATH, "//div[@id='1']//a[contains(text(),'_')]")       # 需要等待的元素,進行定位
# 等待上線為20秒,直到等待元素出現
WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc_1))        # 等待上線為20秒,直到等待元素出現

# 點擊操作之前的窗口總數   1
a_handles = driver.window_handles       # 點擊操作之前的窗口總數   1
# 點擊騰訊課堂鏈接
driver.find_element(*loc_1).click()     # 點擊騰訊課堂鏈接
# 點擊鏈接后會出現新窗口,需要等待
WebDriverWait(driver, 20).until(EC.new_window_is_opened(a_handles))     # 點擊鏈接后會出現新窗口,需要等待

# 點擊鏈接后,需要再次獲取新窗口總數  2
wins = driver.window_handles        # 點擊鏈接后,需要再次獲取新窗口總數  2
# 切換到想要的窗口
driver.switch_to.window(wins[-1])       # 切換到想要的窗口

# 在騰訊課堂頁面,定位元素,操作
# 定位登錄按鈕
loc_2 = (By.ID, 'js_login')     # 定位登錄按鈕
# 等待元素可見
WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc_2))        # 等待元素可見
# 在騰訊課堂頁面,點擊登錄
driver.find_element(*loc_2).click()     # 在騰訊課堂頁面,點擊登錄

# 定位 QQ登錄 元素可見
loc_3 = (By.XPATH, '//a[text()="QQ登錄"]')
WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc_3))
driver.find_element(*loc_3).click()     # 點擊QQ登錄
time.sleep(1)

# iframe(譯:衣服潤么)切換,兩種方式,七中方法

# 方式一:支持三種方法;switch_to.frame(譯:思維吃.服潤么)
# 下標切換、name名字屬性切換、webelement對象切換
# driver.switch_to.frame("login_frame_qq")  # name屬性  或
# driver.switch_to.frame(2)         # 下標切換  或

# driver.switch_to.frame(driver.find_element_by_name('login_frame_qq'))     # 或 webelement對象,需要等待下
# 方式一的三種方法盡可能等待一下,在進行之后的操作
#
time.sleep(1) # 方式二:更加穩定,支持四種 # 騷操作: EC條件 - 條件:等待iframe有效並切換到iframe當中。 # EC(譯:一科四盤課題的.肯迪深思)模塊中的 frame_to_be_available_and_switch_to_it(譯:福軟木.圖.比.額為類bou.按得.思維吃.圖.易特)判斷方法 # 支持4種切換:下標切換、name名字屬性切換、webelement對象切換、元素定位元組 WebDriverWait(driver, 20).until( EC.frame_to_be_available_and_switch_to_it((By.XPATH, '//iframe[@name="login_frame_qq"]'))) # 等待 帳號密碼登錄 元素可見,進行點擊操作:帳號密碼登錄 loc_4 = (By.ID, 'switcher_plogin') WebDriverWait(driver, 20).until(EC.visibility_of_element_located(loc_4)) driver.find_element(*loc_4).click() time.sleep(1) driver.find_element_by_xpath('//input[@id="u"]').send_keys('自己的賬號') # 輸入賬號 time.sleep(1) driver.find_element_by_xpath('//input[@id="p"]').send_keys("自己的密碼") # 輸入密碼 time.sleep(1) driver.find_element_by_xpath('//input[@id="login_button"]').click() # 點擊登錄 time.sleep(4) driver.quit() # 關閉瀏覽器

有多層 iframe 的 HTML 頁面怎么切?如何回到主HTML頁面?如何切換回上層HTML頁面—— 在切一遍就好

# 內嵌的iframe當中,還有iframe怎么處理?---同理再次使用方法切換
driver.switch_to.frame()

# 一步到位:直接回到main頁面就是第一個HTML頁面。 (譯:的否特。康ten特)
driver.switch_to.default_content()

# 切換到上層iframe的HTML頁面。(譯:潘瑞慈)
driver.switch_to.parent_frame()

 

彈窗切換-----會使用alert類來處理,包括:獲取彈窗內文本內容、確定、取消、輸入內容這四種方法

  瀏覽器定位時選不中彈窗,不是 彈窗 就是 windows上傳文件窗口

借用大佬總結的 javascript 的 3 種彈框:https://www.cnblogs.com/xyao1/p/7451518.html

1、alert()--警告消息框,只有確認按鈕

2、confirm()--確認消息框,有確認和取消按鈕

3、prompt()--提示消息框,需要輸入內容后,確認和取消按鈕

從 HTML 頁面 切換到 js 的三種彈框內

js彈框,元素無法定位

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC  # (譯:一科四盤課題的.肯迪深思)
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()

driver.get(r"D:\python_web\web_baitianyang\web項目 前期\myH.html")
# 做一個操作,導致alert框出現;點擊后彈窗出現
driver.find_element_by_id("press_me").click()

# 方式一:直接切換到alert彈框;switch_to.alert(譯:思維吃.圖.餓了特)
# alert = driver.switch_to.alert

# 方式二:更加穩定;使用EC模塊中的alert_is_present條件判斷彈窗是否已出現,並切換到alert當中
# 騷操作:EC條件 : 判斷alert彈框是否已出現,並切換到alert當中;alert_is_present(譯:餓了特.意思.鋪兒怎特)
alert = WebDriverWait(driver, 10).until(EC.alert_is_present())

# 獲取 alert 中的文本內容
print(alert.text)
# 點擊確定,關閉彈框
alert.accept()

time.sleep(5)   # 等待5秒,
driver.quit()   # 關閉瀏覽器

# 獲取 alert 中的文本內容:
# alert.text
# 點擊確定,關閉彈框:accept(譯:餓了特.安可賽潑特)
# alert.accept()
# 點擊取消使用:(譯:餓了特.抵死迷死)
# alert.dismiss()
# 往彈框中出入文本:(譯:餓了特.森的.K次)
# alert.Send_keys()

 


免責聲明!

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



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