在进行操作之前,首先要确保自己环境已经配置好。
如果你能运行以下两行代码,跳出163界面,恭喜你,可以学习登录了!
from selenium import webdriver
driver = webdriver.Edge()
driver.get('https://mail.163.com/')
其实,登录163邮箱我们可以拆解为以下几个动作:
1.告诉程序我们要登录哪个网站。
2.在网站上找到我们要的元素
3.告诉这个元素应该做什么(eg:文本框就输入,按钮就click)
我们先来看以下代码的框架,接下来分3个步骤解决
from selenium import webdriver
from selenium.webdriver.common.by import By
# 第一步:告诉网址
driver.get('https://mail.163.com/')
# 第二步第三步 找到元素 告知动作
driver.find_element(By.NAME, 'email').send_keys('yonghuming')
STEP1:指定网址
最简单的一步,即driver.get('http://xxxxxxx')
STEP2:找到元素 指明操作
在selenium4当中,我们用find_element的方法,详细见:Selenium4.9.1-元素定位方法大全_selenium定位多个元素_Ciel_321的博客-CSDN博客w
也就是说,我们只要知道元素的id/name/class就能定位元素了,我们F12或者Fn+F12进入检查,Ctrl+Shift+C选中元素进入检查,就可以知道用户名哪一行元素的代码了。
如果driver.find_element(By.NAME,'email'),会发现报错,报错的原因是“登录”在iframe框架里面,我们要先定位到iframe,才能find_element。
问题1:如何辨别iframe?有iframe怎么办?
方法1:顺着找元素的代码,肯定能找到
注意,这里虽然告诉你id,但是不可以driver.find_element(By.ID,'email'),因为这个ID是动态变化的。
方法2:利用SelectorGadget插件,浏览器搜索就能下载,使用很简单,不赘述
你发现,说好的email不能单独选中,只能选个大框,而且下面显示了是iframe,所以我们对代码稍加修饰,马上就能进入框架啦
iframe_element=driver.find_element(By.TAG_NAME, 'iframe')
driver.switch_to.frame(iframe_element)
问题2:网页还没加载好,元素还没出现,怎么可能能find到呢?
只要给网页一点反应时间就可以了,比较简单,我把完整代码放在下面:
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Edge()
driver.get('https://mail.163.com/')
# 给网页点反应时间 加载一会让元素出现
iframe_element = WebDriverWait(driver, 25).until(
EC.presence_of_element_located((By.TAG_NAME, 'iframe'))
)
# 切换到 iframe
driver.switch_to.frame(iframe_element)
driver.find_element(By.NAME, 'email').send_keys('yonghuming')
sleep(5)
driver.find_element(By.NAME, 'password').send_keys('mima')
sleep(5)
driver.find_element(By.ID,'dologin').click()
print('yesyesyes')
driver.close()