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)
最終完成的該部分代碼如上所示,此時改元素定位不到的問題得到解決。
