今天是学习selenium2第四天。总结下今天的学习成果,自动登录网易邮箱并写信发送邮件。
知识点or坑点:
1、模块化编写测试模块(类似java里的抽象方法,js的函数编写)
from 包名 import 类
调用def定义的方法
2、xpath怎么获取包含部分文本的标签
#获取写信按钮:先获取包含‘写’字的span,再取它的上级li xx = driver.find_element_by_xpath('//span[contains( text(),"写" )]/parent::li')
1)contains方法为部分包含,模糊查找;(开始找“写信”两个字始终没找到,因为其实文本是“写 信”,坑)
2)python的xpath获取text方法比较特殊,其他属性都是“@属性”获取,文本却是用text()""
3)父节点获取使用parent::
参考原文链接:http://blog.csdn.net/TestLearner/article/details/75569388
3、无法用id、name定位到iframe时,怎么定位frame
#利用xpath获取frame 再switch_to frame = driver.find_element_by_xpath("//iframe[@class='APP-editor-iframe']") driver.switch_to.frame(frame)
1) driver.switch_to.frame('ID'),driver.switch_to.frame('name')都可以定义子frame,然后就可以操作frame内元素了
2)在无法正常获取frame内元素时,可使用sleep(秒)方法多等待一会,设置1秒一般就够了(坑)
大家都是程序员,以下就贴代码了
首先是模块化编写public包,定义一个class:
1 from time import sleep 2 3 class Login(): 4 5 #登录 6 def user_login(self,driver): 7 username = 'testuser'#邮箱用户名 8 pwd = 'testpwd123'#密码 9 emailInput = driver.find_element_by_name("email") 10 emailInput.clear() 11 #emailInput.send_keys(username)#火狐执行无效 12 email_id = emailInput.get_attribute("id") 13 js = 'document.getElementById("'+email_id+'").value="'+username+'"' 14 print(js) 15 driver.execute_script(js)#执行js 16 pwdInput = driver.find_element_by_name("password") 17 pwdInput.clear() 18 pwdInput.send_keys(pwd) 19 dologin = driver.find_element_by_id("dologin") 20 dologin.click() 21 22 #退出 23 def user_logout(self,driver): 24 driver.find_element_by_link_text("退出").click() 25 driver.quit() 26 27 #写信 28 def write(self,driver): 29 #获取写信按钮:先获取包含‘写’字的span,再取它的上级li 30 xx = driver.find_element_by_xpath('//span[contains( text(),"写" )]/parent::li') 31 sx = driver.find_element_by_xpath('//span[contains( text(),"收" )]/parent::li') 32 print('写:',xx.text,'--收:',sx.text) 33 print('写:',xx.get_attribute('class'),'--收:',sx.get_attribute('class')) 34 xx.click() 35 36 #收件人 37 sjr = driver.find_element_by_xpath('//input[@class="nui-editableAddr-ipt"]') 38 sjr.clear() 39 #sjrId = sjr.get_attribute('id') 40 #js = 'document.getElementById('+sjrId+').innerText=448671246@qq.comWW' 41 #driver.execute_script(js) 42 sjr.send_keys('448671246@qq.com') 43 44 45 #主题 46 zt = driver.find_element_by_xpath('//div[@class="bz0"]/div/input[@class="nui-ipt-input"]') 47 #print( len(zt) ) 48 zt.send_keys('我是主题') 49 50 #利用xpath获取frame 再switch_to 51 frame = driver.find_element_by_xpath("//iframe[@class='APP-editor-iframe']") 52 driver.switch_to.frame(frame) 53 54 #等待1秒,再获取frame内容 55 sleep(2) 56 57 #内容 58 bd = driver.find_element_by_xpath('//body[@class="nui-scroll"]') 59 bd.send_keys('我是测试内容002') 60 61 #返回主页面后,需要等待一下,否则可能定位不到元素 62 driver.switch_to.default_content() 63 sleep(2) 64 65 #随便选择一个发送按钮,点击发送 66 fs = driver.find_elements_by_xpath('//span[@class="nui-btn-text"]/parent::div[contains(@class,"nui-btn-hasIcon nui-mainBtn-hasIcon")]') 67 print('fs len is ',len(fs)) 68 fs[0].click()#发送 69 70 71 72 73 74 75 76 77
写完了public包,定义一个Login类,再来看怎么引用
1 from selenium import webdriver 2 from public import Login 3 from time import sleep 4 5 #打开谷歌浏览器 6 dr = webdriver.Chrome() 7 8 #隐式等待10秒,等待页面元素加载完毕 9 dr.implicitly_wait(10) 10 11 #打开网页 12 url = 'http://mail.163.com' 13 dr.get(url) 14 15 #沉睡等待一秒后定位frame 16 sleep(1) 17 dr.switch_to.frame('x-URS-iframe') 18 19 try: 20 #调用登录模块 21 Login().user_login(dr) 22 print('登录成功') 23 except BaseException as msg: 24 print(msg) 25 dr.quit() 26 27 28 #返回主frame 29 dr.switch_to.default_content() 30 sleep(1) 31 32 try: 33 #退出 34 Login().write(dr) 35 print('写信成功') 36 except BaseException as msg: 37 print(msg) 38 sleep(1) 39 dr.quit() 40 41 42 sleep(1) 43 try: 44 #退出 45 Login().user_logout(dr) 46 print('退出成功') 47 except BaseException as msg: 48 print(msg) 49 dr.quit()