自动化测试脚本-帐号注册到激活
在https://www.oschina.net/(开源中国)网站使用邮箱注册,登录QQ邮箱激活注册帐号:
#coding=utf-8 from selenium import webdriver #用谷歌浏览打开https://www.oschina.net/ drvier=webdriver.Chrome() drvier.get('https://www.oschina.net/') #浏览器在全屏幕模式下执行2 drvier.maximize_window() #点击注册 drvier.find_element_by_xpath('/html/body/header/div/div[2]/div/a[2]').click() #使用邮箱注册 drvier.find_element_by_xpath('/html/body/section/div/div/div[1]/nav/span[2]/span').click() #输入邮箱 drvier.find_element_by_xpath('//*[@id="userMail"]').send_keys('******') #输入昵称 drvier.find_element_by_xpath('//*[@id="mail_logon"]/div/div[2]/div[1]/input').send_keys('******') #输入密码 drvier.find_element_by_xpath('//*[@id="mail_logon"]/div/div[3]/div[1]/input').send_keys('******') #再次输入密码 drvier.find_element_by_xpath('//*[@id="mail_logon"]/div/div[4]/div[1]/input').send_keys('******') #手动输入验证码 number=input('请输入验证码:') drvier.find_element_by_xpath('//*[@id="mail_logon"]/div/div[5]/div[1]/input').send_keys(number) #选择性别 drvier.find_element_by_xpath('//*[@id="mail_logon"]/div/div[6]/div/div[2]/label').click() #同意协议 drvier.find_element_by_xpath('//*[@id="mail_logon"]/div/div[7]/div[1]/input').click() #点击注册 drvier.find_element_by_xpath('//*[@id="mail_logon"]/div/div[8]/button').click()
#访问QQ邮箱 drvier.get('https://mail.qq.com/') #切换到iframe(id='login_frame') drvier.switch_to.frame('login_frame')
#登录QQ邮箱激活开源中国社区 drvier.find_element_by_xpath('//*[@id="u"]').send_keys('******') drvier.find_element_by_xpath('//*[@id="p"]').send_keys('******') drvier.find_element_by_xpath('//*[@id="login_button"]').click() #切换到iframe(id='mainFrame') drvier.implicitly_wait(3) drvier.switch_to.frame(drvier.find_element_by_xpath('//*[@id="mainFrame"]')) #点击收件箱 drvier.find_element_by_xpath('//*[@id="folder_1"]').click() #点击激活邮件 drvier.find_element_by_xpath('//*[@id="div_showtoday"]/table/tbody/tr/td[3]/table/tbody/tr/td[3]/div[1]/u').click() #获得激活链接窗口句柄 jh_windows=drvier.current_window_handle #点击激活链接 drvier.find_element_by_xpath('//*[@id="mailContentContainer"]/table/tbody/tr[3]/td/p[2]/a').click() #获得当前所有打开的窗口的句柄 all_handles = drvier.window_handles #获得继续访问窗口句柄 for handle in all_handles: if handle != jh_windows: drvier.switch_to.window(handle) #点击继续访问 drvier.find_element_by_xpath('/html/body/div/div[2]/div[2]/a[1]').click()
问题一:刚开始在定位昵称、密码、验证码、性别、协议、注册元素时,提示:element not visible ,原因是由于页面上有两个结构类似的元素(用手机注册也有这些元素),因为这个定义对“手机注册”元素也同样适用,而且“手机注册”元素的位置在前面,所以就会出现element not visible。
解决方法:使用全路径的xpath(或者是往前定位,直到能区分出元素1和元素2)。
问题二:在登录页面定位用户名和密码时,提示:NoSuchElementException: Message: Unable to locate element,原因是由于嵌套了iframe框架,
WebDriver 每次只能在一个页面上识别元素,对于iframe 嵌套内的页面上的元素,直接定位是定位是定位不到的。
解决方法:selenium提供了switch_to.frame()方法来切换frame,括号里的内容可以传入id、name、index以及selenium的WebElement对象。
通常采用id和name就能够解决绝大多数问题。但有时候frame并无这两项属性,则可以用index和WebElement来定位:
- index从0开始,传入整型参数即判定为用index定位,传入str参数则判定为用id/name定位;
- WebElement对象,即用find_element系列方法所取得的对象,我们可以用tag_name、xpath等来定位frame对象。
问题三:在用“find_element_by_class_name()”方法定位元素属性class="c-footer-a1 btn_blue"时,提示:invalid selector: Compound class names not permitted,原因是由于class属性存在空格,
解决方法:换成CSS 定位或者其他方式定位。
问题四:在最后点击继续访问按钮时,提示:NoSuchElementException: Message: Unable to locate element,原因是由于没有定位到当前窗口。
解决方法:
- current_window_handle 获得当前窗口句柄
- window_handles 返回的所有窗口的句柄到当前会话
- switch_to_window() 用于切换到相应的窗口,与上一节的switch_to_frame() 是类似,前者用于不同窗口的切换,后者用于不同表单之间的切换。