問題描述
如上圖所示,爲某數據網站,自動登錄時,點擊登錄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()
此種情況常遇見於初始頁面登錄的地方