python+selenium自动登录163邮箱代码提示错误解决方案(如:NoSuchFrameException: Message: no such frame)

selenium模块实现163邮箱自动登录操作

利用selenium模块控制Chrome浏览器打开163邮箱网页,并实现自动填写账号密码操作。

在Python中利用selenium模块实现这一目的只需要简单几步,但碍于初学者,本身对于HTML的认知也仅限于自学Python的书中提及的一些简单概念,所以在尝试邮箱的自动登录操作时遇到了2个问题,特此记录下来便于后续学习。

代码块

#! /usr/bin/env python3
# login.py - 邮箱自动登录

from selenium import webdriver                            #导入selenium模块

browser = webdriver.Chrome()                              #启动Chrome浏览器
browser.get('http://mail.163.com/')                       #打开163邮箱登录页面

email_elem = browser.find_element_by_name('email')        #查找name属性值为'email'的元素
email_elem.send_keys('not_my_real_email')                 #调用send_keys()方法,填写账号
password_elem = browser.find_element_by_name('password')  #查找name属性值为'password'的元素
password_elem.send_keys('12345')                          #填写密码
do_login = browser.find_element_by_id('dologin')          #查找登录按钮的元素
do_login.click()                                          #模拟鼠标点击登录按钮
print('Done!')

上述是我第一次编辑的代码,运行后提示”no such element”错误
这里写图片描述
通过网上检索发现是因为163邮箱的源码内含有 iframe 元素,iframe 元素会创建包含另外一个文档的内联框架(即行内框架)。而webdriver每次只能在一个页面识别,因此需要先定位到相应的frame,再对页面里的元素进行定位。
163邮箱页面的源码中包含iframe元素

解决方法:

因为iframe元素中有id属性值,我们可以直接使用switch_to_frame(“name值”)或switch_to_frame(“id值”)的方法来进行定位。

browser.switch_to_frame('x-URS-iframe')

添加后的代码块如下:

#! /usr/bin/env python3
# login.py - 邮箱自动登录

from selenium import webdriver                            #导入selenium模块

browser = webdriver.Chrome()                              #启动Chrome浏览器
browser.get('http://mail.163.com/')                       #打开163邮箱登录页面

browser.switch_to_frame('x-URS-iframe')                   #定位到iframe元素中进行查找(新添加的代码行)
email_elem = browser.find_element_by_name('email')        #查找name属性值为'email'的元素
email_elem.send_keys('not_my_real_email')                 #调用send_keys()方法,填写账号
password_elem = browser.find_element_by_name('password')  #查找name属性值为'password'的元素
password_elem.send_keys('12345')                          #填写密码
do_login = browser.find_element_by_id('dologin')          #查找登录按钮的元素
do_login.click()                                          #模拟鼠标点击登录按钮
print('Done!')

通过修改代码之后,再次运行检测是否正常,结果出现了另外的问题,提示找不到相关的frame(错误提示:NoSuchFrameException: Message: no such frame)
这里写图片描述
尝试了多种方法都依然提示找不到相关的frame错误,最后找到了解决方法,其实是程序在打开网页后,进行下一步操作时,frame还未加载进来导致的。所以在定位frame元素之前,加一个延时操作,程序就能够顺利继续下去了。

最终的代码块

#! /usr/bin/env python3
# login.py - 邮箱自动登录

import time                                               #导入time模块(新添加的代码行)
from selenium import webdriver                            #导入selenium模块

browser = webdriver.Chrome()                              #启动Chrome浏览器
browser.get('http://mail.163.com/')                       #打开163邮箱登录页面

time.sleep(1)                                             #等待1秒再进行下一步操作(新添加的代码行)
browser.switch_to_frame('x-URS-iframe')                   #定位到iframe元素中进行查找
email_elem = browser.find_element_by_name('email')        #查找name属性值为'email'的元素
email_elem.send_keys('not_my_real_email')                 #调用send_keys()方法,填写账号
password_elem = browser.find_element_by_name('password')  #查找name属性值为'password'的元素
password_elem.send_keys('12345')                          #填写密码
do_login = browser.find_element_by_id('dologin')          #查找登录按钮的元素
do_login.click()                                          #模拟鼠标点击登录按钮
print('Done!')

这里我导入time模块后,调用了time.sleep(1)方法,让程序在打开网页进行下一步操作之前等待1秒,当然这个时间可以更短,这里只是为了测试程序能够顺利走完而设定的。

猜你喜欢

转载自blog.csdn.net/simplelearner/article/details/81947215
今日推荐