今天想用利用python和selenium框架来练习下自动化登录,看了好多网站登录需要验证码对博主刚入门的人还是有点难度,因此想找一个不需要验证码的网站登录,实在不好找,想着网易的产品还是做得很好的,所以去查看了网易相关的网站,发现网易严选登录是不需要验证码的,不过还是遇到了坑(iframe切换)
从邮箱登录界面开始:
找到了邮箱账号输入框的元素,如果你之前都依赖与用右键直接copy浏览器自动生成的xpathname,在这里一定不会奏效,这也告诉我们一定要自己学会写xpath。在网易严选的这个登录界面仅仅写对xpath还是没有用的,因为这里有一个坑,就是iframe框架,我们要的元素都是在这个框架下,因此要先切换到iframe才能继续定位元素。你可以简单认为iframe框架下的元素和背后的页面不在同个界面里,因此我们无法直接定位到这个弹窗里的元素(这么说不一定合适)。
第一步:先定位iframe
如果iframe里有唯一的属性,例如id和name,我们可以直接使用driver.switch_to_frame("id/name")就解决问题了,然后继续用xpath进行元素定位。当然,如果你能确定这个页面中有几个iframe的时候,你可以直接用索引的方式来切换,如果这个页面中有三个iframe,这个iframe处于第二个,可以写成driver.switch_to_frame(1),从0开始的
在网易严选的这个页面中,注意iframe的name=0,id是那么一串数字还有小数,很明显是动态的id,刷新下就变了,因此不具备唯一的属性,所以不能依靠属性直接切换到iframe。所以我们先用xpath定位到iframe,在进行切换。仔细观察下,发现iframe的父节点div具有唯一属性的id=j-yx-mailLoginWrap,因此根据属性匹配和绝对路径的方式写xpath:ele=driver.find_element_by_xpath("//*[@id='j-yx-mailLoginWrap']/iframe"),(当然也可以用其他很多方法来定位)。再执行driver.switch_to_frame(ele)就可以成功切换到iframe了。
第二步:xpath定位邮箱账号输入框
发现这个input的属性非常多,这时候要注意属性的唯一性,有的可能并不是唯一就会导致定位不准确,博主在这选择了class属性,下边还有一个密码输入框,把它点开对比了下它们的class值。选用class作为属性匹配,xpath写成ele=driver.find_element_by_xpath("//*[@class='j-inputtext dlemail']"),这时候就大功告成了!
网易严选自动化邮箱账号登录python脚本代码(博主在python自带的集成开发环境下写的,好处是可以看到每一步的变化):
python版本3.5
>>>from selenium import webdriver #导入webdriver
>>> b = webdriver.Firefox() #用的火狐浏览器
>>> b.get("http://you.163.com") #输入url
>>> ele = b.find_element_by_xpath("//*[@class='j-yx-cp-topLogin']") #定位登录按钮
>>> ele.click() #点击登录按钮
>>> ele = b.find_element_by_xpath("//*[@id='j-yx-loginFormWrap']/div/div[1]/div[1]/div[3]") #定位邮箱登录按钮
>>> ele.click() #点击邮箱登录按钮切换到邮箱登录
>>> ele1 = b.find_element_by_xpath("//*[@id='j-yx-mailLoginWrap']/iframe") #定位到iframe
>>> b.switch_to_frame(ele1) #切换到iframe
>>> ele2 = b.find_element_by_xpath("//*[@class='j-inputtext dlemail']") #定位账号输入框
>>> ele2.send_keys("xxx@163.com") #输入邮箱账号
>>>ele3 = b.find_element_by_xpath("//*[@class='j-inputtext dlpwd']") #定位密码输入框
>>> ele3.send_keys("xxx") #输入密码
>>> ele4 = b.find_element_by_xpath("//*[@id='dologin']") #定位登录按钮
>>> ele4.click() #点击登录按钮