selenium中的元素操作之三大切換(二)


一、窗口切換

使用方法:

1、獲取到打開的所有的窗口,句柄handles

all_handles = driver.window_handles

print(all_handles)

2、獲取當前的窗口

driver.current_window_handle

print(driver.current_window_handle)

3、利用切換的語句,切換到想要操作的窗口(HTML頁面)

# 獲取到的所有窗口為一個列表,用索引取值

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

舉例說明:

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


# 創建一個Chrome會話
driver = webdriver.Chrome()
# 訪問百度首頁
driver.get("http://baidu.com")

wait = WebDriverWait(driver, 20)
# 定位輸入框,並輸入“騰訊課堂”進行搜索
driver.find_element_by_id('kw').send_keys("騰訊課堂")
# 點擊搜索按鈕
driver.find_element_by_id('su').click()
# 滿足以下條件,才會進行下一步
loc = (By.XPATH, '//div[@id="1"]/h3[@class="t"]/a[1]')
wait.until(EC.visibility_of_element_located(loc))
driver.find_element_by_xpath('//div[@id="1"]/h3[@class="t"]/a[1]').click()  # 出現了新的HTML頁面
time.sleep(2)

# 獲取所有的窗口,句柄
all_handles = driver.window_handles
# 切換到新打開的窗口
driver.switch_to.window(all_handles[-1])

# 在新的頁面中找元素,並操作。
# 找到登錄的元素,並點擊登錄的按鈕
loc = (By.XPATH, '//div[@id="js-mod-entry-index"]//a[text()="登錄"]')
wait.until(EC.visibility_of_element_located(loc))
driver.find_element(*loc).click()
time.sleep(2)

# 關閉瀏覽器
driver.quit()

上述的方法在新窗口出現之后,需要有一個強制的等待頁面加載的時間time.sleep(2),這樣是為了保證在頁面未加載出來去點擊,導致程序報錯。我們采用的是強制等待的方式;那么在這里有一個小小的騷操作,在expected_conditions文件中,有一個new_window_is_opened類,等待新窗口的出現;該類調用時要傳入一個current_handles的參數,功能為:所有的窗口句柄>current_handles,結果為True,條件成立。這個騷操作主要是為了替代強制等待這種方法,當然兩種方法都可以用。

騷操作舉例說明:

 

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


# 創建一個Chrome會話
driver = webdriver.Chrome()
# 訪問百度首頁
driver.get("http://baidu.com")

wait = WebDriverWait(driver, 20)
# 定位輸入框,並輸入“騰訊課堂”進行搜索
driver.find_element_by_id('kw').send_keys("騰訊課堂")
# 點擊搜索按鈕
driver.find_element_by_id('su').click()
# 滿足以下條件,才會進行下一步
loc = (By.XPATH, '//div[@id="1"]/h3[@class="t"]/a[1]')
wait.until(EC.visibility_of_element_located(loc))


# 在新的窗口出現之前,獲取窗口列表,這時窗口數為1
cur_handles = driver.window_handles
driver.find_element_by_xpath('//div[@id="1"]/h3[@class="t"]/a[1]').click()  # 出現了新的HTML頁面
# 出現新的窗口之后,窗口數為2,2>1,條件為True
wait.until(EC.new_window_is_opened(cur_handles))
# 再次獲取所有的窗口
# 獲取所有的窗口,句柄 all_handles = driver.window_handles # 切換到新打開的窗口 driver.switch_to.window(all_handles[-1]) # 在新的頁面中找元素,並操作。 # 找到登錄的元素,並點擊登錄的按鈕 loc = (By.XPATH, '//div[@id="js-mod-entry-index"]//a[text()="登錄"]') wait.until(EC.visibility_of_element_located(loc)) driver.find_element(*loc).click() time.sleep(2) # 關閉瀏覽器 driver.quit()

 二、iframe切換

 

切換的條件:如果你要操作的元素,在iframe當中, 你才需要切換
頁面元素(容器)-里面是一個HTML頁面

iframe定位方式    driver.switch_to.frame()
    index,下標
        driver.switch_to.frame(3)
    name屬性
        driver.switch_to.frame("name屬性的值")
    webelement對象
        driver.switch_to.frame(driver.find_element_by_xpath('xpath表達式'))
            支持selenium中8中定位方法
    嵌套的iframe
        driver.switch_to.frame()
    直接返回main頁面
        driver.switch_to.default_content()
    切換到父級iframe
        driver.switch_to.parent_frame()

舉例說明:以登錄騰訊課堂為例

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


# 實例化webdriver中的Chome對象
driver = webdriver.Chrome()
# 訪問騰訊課堂
driver.get('https://ke.qq.com/')

# 查找登錄按鈕,設置等待條件
loc = (By.XPATH, '//div[@id="js-mod-entry-index"]//a[text()="登錄"]')
# 找到找到登錄的元素在進行下一步操作,查找時間上限為10秒
WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc))
# 找到元素,並點擊
driver.find_element(*loc).click()
time.sleep(3)

# 點擊QQ登錄,等待元素被找到進行下一步
loc = (By.XPATH, '//a[@class="js-btns-enter btns-enter btns-enter-qq"]')
WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc))
driver.find_element_by_xpath('//a[@class="js-btns-enter btns-enter btns-enter-qq"]').click()
time.sleep(1)

# iframe切換方式一:通過下標、name屬性、webelement對象進行切換
# 彈出一個iframe登錄框,定位iframe框 driver.switch_to.frame('login_frame_qq') # 使用顯性等待 loc = (By.ID, 'switcher_plogin') WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc)) # 查找用賬號密碼登錄元素 driver.find_element(*loc).click() time.sleep(0.5) # 輸入賬號 driver.find_element_by_id('u').send_keys("xxxx") # 輸入密碼 driver.find_element_by_id('p').send_keys('xxxxx') driver.find_element_by_id('login_button').click() time.sleep(3) # 退出 driver.quit()

 iframe騷操作:

 1 from selenium import webdriver
 2 from selenium.webdriver.support.wait import WebDriverWait
 3 from selenium.webdriver.support import expected_conditions as EC
 4 from selenium.webdriver.common.by import By
 5 import time
 6 
 7 
 8 # 創建一個Chrome對象
 9 driver = webdriver.Chrome()
10 # 窗口最大化
11 driver.maximize_window()
12 # 訪問騰訊課堂
13 driver.get('https://ke.qq.com/')
14 
15 # 定位登錄按鈕,並點擊操作,利用顯示等待
16 loc = (By.ID, 'js_login')
17 WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc))
18 driver.find_element_by_id('js_login').click()
19 
20 # 定位QQ登錄按鈕,並點擊操作,顯示等待
21 loc = (By.XPATH, '//a[@class="js-btns-enter btns-enter btns-enter-qq"]')
22 WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc))
23 driver.find_element(*loc).click()
24 time.sleep(1)
25 
26 # iframe切換方式二:下標、name屬性、webelement對象、元素定位元組四種
27 # iframe騷操作,EC條件中,frame_to_be_available_and_switch_to_it這個條件,說明iframe有效並切換到iframe中
28 # 切換到登錄的iframe頁面中
29 WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, '//iframe[@name="login_frame_qq"]')))
30 driver.find_element_by_id('switcher_plogin').click()
31 time.sleep(1)
32 # 定位輸入框,輸入賬戶名、密碼
33 driver.find_element_by_id('u').send_keys('xxx')
34 driver.find_element_by_id('p').send_keys('xxx')
35 # 點擊登錄按鈕
36 driver.find_element_by_id('login_button').click()
37 time.sleep(3)
38 
39 # 關閉瀏覽器
40 driver.quit()

 

 alert彈框:

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


# 創建一個Chrome會話
driver = webdriver.Chrome()
# 訪問某網站
driver.get("http://xxx.com")
# 做一個操作,出現alert彈窗
driver.find_element_by_id('xxx').click()


# 方式一:
# 切換到alert彈窗
alert_1 = driver.switch_to.alert

# 方式二(騷操作):
# EC條件,alert彈框已出現,並切換到alert彈框中
alert_2 = WebDriverWait(driver, 10).until(EC.alert_is_present())


# 三種彈框,分別的操作方式
# 點擊確定,關閉彈窗
alert_1.accept()
alert_2.accept()
# 點擊取消
alert_1.dismiss()
alert_2.dismiss()
# 輸入文本內容
alert_1.send_keys('xxx')
alert_2.send_keys('xxx')

# 關閉瀏覽器
driver.quit()

JavaScript三種彈框方式:https://www.w3school.com.cn/js/js_popup.asp

 


免責聲明!

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



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