當selenium爬蟲遇到彈窗——iframe定位

問題描述

在這裏插入圖片描述
如上圖所示,爲某數據網站,自動登錄時,點擊登錄button會出現彈窗讓你輸入賬號密碼,此時定位輸入框send_keys發送參數,報錯信息如下:找不到元素(定位條件確認沒寫錯)

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[name="loginCode"]"}

原因分析

在這裏插入圖片描述

仔細分析頁面源碼發現,所要查找的元素處於一個iframe標籤下(通常稱爲網頁佈局嵌套),而一般webdriver要操作頁面元素需要在Top Window的狀態下,當瀏覽器出現iframe時,用正常的元素定位是沒有效果的,需要將頁面裝換到iframe下再對頁面元素進行操作(大致可以理解爲頁中頁,及一個頁面裏嵌套了一個頁面,而selenium的操作網頁的原理是依靠窗口句柄,當前句柄在外面窗口,定位元素在內部窗口,所以無法定位到元素關於selenium的句柄切換詳見下一篇文章,還沒寫!後面整理下再寫,跟本次所要講的切換類似又有點兒差異,有興趣的可以百度一下,有前輩們貢獻過!

解決方案

#定位到iframe
iframe=drive.find_element_by_tag_name("iframe")

#句柄切換進iframe
drive.switch_to_frame(iframe)

#輸入用戶名
drive.find_element_by_name("loginCode").send_keys(user_name) 
time.sleep(random.uniform(1,1.5))

!!!perfect !!!在這裏插入圖片描述

#跳出iframe
drive.switch_to_default_content()
#如果不跳出再次進入iframe也會報錯,找不到元素,相當於在iframe裏找一個iframe

如果driver.switch_to_frame()失效請改用新操作:driver.switch_to.frame()

同理,如果drive.switch_to_default_content()失效
請改用新操作:drive.switch_to.default_content()

【本文環境配置:selenium版本:3.141.0;chrome版本:76.0.3809,兩種寫法都可以】

總結

#定位iframe
#也可以用其他屬下定位同selenium常用定位方法,即iframe本身也是一個元素
iframe=drive.find_element_by_tag_name("iframe")

#跳進
drive.switch_to_frame(iframe)
#或
drive.switch_to.frame(iframe)

#跳出
drive.switch_to_default_content()
#或
drive.switch_to.default_content()

此種情況常遇見於初始頁面登錄的地方

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章