selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element 定位frame中的元素


from selenium import webdriver
import time

def sleep(w=1):
    time.sleep(w)
    return 0

# 初始化瀏覽器信息
driver = webdriver.Chrome()
driver.get("http://m.mail.10086.cn")

print("------------------------------login in-------------------------------")
title = driver.title
now_url = driver.current_url
print(title)
print(now_url)
sleep()

driver.find_element_by_name("UserName").clear()
driver.find_element_by_name("UserName").send_keys("userName")
sleep()
driver.find_element_by_css_selector(".textBox_pw").clear()
driver.find_element_by_css_selector(".textBox_pw").send_keys("passWord")
sleep()
driver.find_element_by_id("loginBtn").click()

print("-----------------------------finish login-----------------------------")

title = driver.title
now_url = driver.current_url
print(title)
print(now_url)
sleep()

userName = driver.find_element_by_id("userName").text
print(userName)

driver.quit()

 上面是初始時完成的代碼,最終的目的是獲取到當前登錄人的昵稱。

上圖為在firefox瀏覽器中獲取到的元素信息,按照以往的經驗,最上面的代碼應該是一次通過的,但是執行的時候出現了如下的錯誤:

翻看網絡上的資料,了解到定位元素僅會在當前所處的frame中尋找該元素,如果有多個frame時需要先切換到對應的frame下才能夠找到該元素。重新查看需要定位的頁面信息發現果真要尋找的元素在一個名為‘ifbg’的iframe下,如下圖所示:

所以如果想要代碼能夠正常執行需要先切換到元素所在的frame下,切換frame使用的語句為:driver.switch_to_frame(***)

此處需要分為兩種情況進行操作:

情況1. 需要切換至的frame有id或name標記,則可以直接使用切換語句,如

driver.switch_to_frame('ifbg') #括號內填入iframe的id或name標記值均可

 情況2.frame沒有id或name標記,但有class標記,需要先獲取到對應的frame,然后在切換至該frame

frame1 = driver.find_element_by_css_selector(".main-iframe")
driver.switch_to_frame(frame1)

frame1 = driver.find_element_by_css_selector(".main-iframe")
driver.switch_to_frame(frame1)
userName = driver.find_element_by_id("userName").text
print(userName)

 最終完成的該部分代碼如上所示,此時改元素定位不到的問題得到解決。

 


免責聲明!

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



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