selenium自動化實戰-基於python語言(二: 編寫腳本)
上一篇文章說到顯示等待和隱式等待語句,我們繼續學習下面的命令方法。
8. 定位一組元素
這裏書上是自己寫了一個頁面代碼,通過訪問本地這個頁面來舉例。但我覺得找一個現有的頁面自己琢磨更有意思,而且復雜的頁面也會遇到復雜的問題。比如我根據163郵箱登錄頁面的 “十天內免登錄” 復選框寫了如下的代碼:
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get(‘http://mail.163.com/‘)
driver.implicitly_wait(20) #這裏加一個隱式等待命令,等待頁面加載,不然可能會報錯
driver.switch_to_frame(‘x-URS-iframe‘) #163郵箱登錄頁面的復選框在一個框架內,所以需要定位到該框架內
#選擇頁面上所有的tag name 為input的元素
inputs = driver.find_elements_by_tag_name(‘input‘) #一定要註意定位一組元素需要是 elements, 而不是element
#通過for循環找出type為checkbox的元素並且單擊勾選
for i in inputs:
if i.get_attribute(‘type‘) == ‘checkbox‘:
i.click()
time.sleep(1)
print(len(inputs)) #這裏結果打印出來是9,所以在這個框架內復選框的個數應該是9,但是比較直觀的我們只能看到“十天內免登錄”
#driver.quit()
上面這段代碼會勾選 “十天內免登錄” 復選框,其實如果單純實現這個行為有更簡單的方法,但是這裏只是為了理解定位一組元素的方法。下面介紹 pop() 方法:
獲取一組元素中最後一個 | pop() 或者 pop(-1) | 例如: driver.find_element_by_id(‘xx‘).pop().click() |
獲取一組元素中的第一個 | pop(0) | |
獲取一組元素中的第二個 | pop(1) |
9. 多表單切換
- 嵌套的iframe有 id 或 name: switch_to_frame(‘‘) 裏面填寫 id 或者 name。 這裏書裏寫的是: switch_to.frame(),這兩個方法我都試過了,全都是正確的。但還是建議用規範的寫法:switch_to.frame()
- 嵌套的iframe 沒有 id 或 name:
.......
xf = driver. find_element_by_xpath(‘//*[@class="if"]‘)
driver.switch_to_frame(xf)
driver.switch_to.parent_frame() # 默認跳出離它最近的switch_to.frame() 方法
driver.switch_to.default_content() # 跳回最外層的頁面
10. 多窗口切換
獲得當前窗口句柄 | current_window_handle | 例如: search_window = driver.current_window_handle |
返回所有打開的窗口的句柄到當前會話 | window_handles | 例如: all_handles = driver.window_handles |
切換到相應的窗口 | switch_to.window() | 例如: driver.switch_to.window(search_window) |
selenium自動化實戰-基於python語言(二: 編寫腳本)