(包含項目)selenium的多層框架定位


簡介

這篇文章主要介紹selenium的多層框架定位。案例是使用selenium自動登陸QQ空間。

思路

1 使用selenium自動請求QQ空間網站 https://i.qq.com/ 。打開后出現如下頁面。

 

2 通過xpath定位到賬號密碼登錄的位置,然后使用click點擊對象。出現如下頁面。

 

 

 

3 通過xpath定位到賬號輸入的位置,密碼輸入的位置,使用send_keys輸入賬號密碼。然后使用xpath定位到登錄的位置,使用click點擊對象。 

問題及解決

  第二步中,當我們使用xpath定位賬號密碼登錄這個元素時,發現定位器沒有問題,但是一直定位不了,

  這時候我們需要判斷這個元素是否在一個frame(框架)中,如果這個元素在一個框架中,我們需要使用switch_to_frame('框架id名')的方法,先找到框架,然后再去定位這個元素。

  判斷一個元素是否在一個框架中的方法:在網頁源代碼中查找關鍵詞frame,看是否有<iframe>標簽。

  我們去QQ空間的網頁源代碼中發現了關鍵詞frame,如下圖所示。

 

 

 

   

 

  因此我們知道第二步和第三步的賬號密碼登錄賬號輸入密碼輸入登錄這四個元素是在id為login_frame框架中的, 我們需要先使用switch_to_frame('login_frame')找到這個框架,然后才能用xpath去定位元素。

  如果一個元素在框架B中,框架B又在框架A中,那么我們需要先找到框架A,再找到框架B,最后才能定位出這個元素。

 1 def login_qqkongjian(account,password):
 2     from selenium import webdriver
 3     import requests
 4     from selenium.webdriver.support.ui import WebDriverWait
 5 
 6     driver = webdriver.Chrome()
 7     driver.get('https://i.qq.com/')
 8     driver.maximize_window()
 9     WebDriverWait(driver, 10).until(lambda driver: driver.find_element_by_xpath('//*[@id="login_frame"]'))
10 
11     driver.switch_to.frame('login_frame')
12     WebDriverWait(driver, 10).until(lambda driver: driver.find_element_by_xpath('//*[@id="switcher_plogin"]'))
13     
14     driver.find_element_by_xpath('//*[@id="switcher_plogin"]').click()
15     WebDriverWait(driver, 10).until(lambda driver: driver.find_element_by_xpath('//*[@id="u"]'))
16     
17     driver.find_element_by_xpath('//*[@id="u"]').send_keys(account)
18     driver.find_element_by_xpath('//*[@id="p"]').send_keys(password)
19     driver.find_element_by_xpath('//*[@id="login_button"]').click()
20 
21 if __name__ == '__main__':
22     account = '***'
23     password = '***'
24     login_qqkongjian(account,password)


免責聲明!

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



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