注册页面的自动化测试

用title_contains来检查我们打开的页面是否正确;以及元素定位方式id、classname、name、xpath

用class name时,可能会定位到多个元素,那就找父元素class定位。先定义一个变量,再用这个变量来找子元素的定位。注意element的单复数!

# coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("http://www.5itest.cn/register")
time.sleep(5)
print(EC.title_contains("注册"))
driver.find_element(By.ID, "register_email").send_keys("1139483036@qq.com")
user_name_element_node = driver.find_elements(By.CLASS_NAME, "controls")[1]
user_element = user_name_element_node.find_element(By.CLASS_NAME,
                                                   "form-control")
user_element.send_keys("zhangyujie")
driver.find_element(By.NAME, "password").send_keys("12121212")
driver.find_element(By.XPATH,
                    "//*[@id='captcha_code']").send_keys("12121212")
time.sleep(5)

使用Expected_conditions来判断页面元素是否存在?可见?引入EC模块和WaitWebDriver模块

# coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
driver.get("http://www.5itest.cn/register")
time.sleep(5)
print(EC.title_contains("注册"))

locator=(By.CLASS_NAME,"controls")
WebDriverWait(driver,1).until(EC.visibility_of_element_located(locator))
driver.close()

输入注册用户名并获取用户信息

email_element = driver.find_element(By.ID, "register_email")
print(email_element.get_attribute("placeholder"))
email_element.send_keys("1139483036@qq.com")
print(email_element.get_attribute("value"))
driver.close()

如何生成用户名

import random
for i in range(5):
    user_email = random.sample('1234567890abcdefg', 5)
    print(user_email)

这样生成的是一个序列list 不是我们要的字符串,用''  .join 。再加上@qq.com字符串

user_email = ''.join(random.sample('1234567890abcdefg', 9))+"@qq.com"

如何解决验证码问题:全屏浏览器,截图,定位验证码的坐标,找出ABCD点,再对截图裁剪得到验证码的图片(*2!!注意电脑的显示比例问题,我电脑是200%显示的,不然location定位不准确)

from PIL import Image
driver = webdriver.Chrome()
driver.get("http://www.5itest.cn/register")
driver.maximize_window()
email_element = driver.find_element(By.ID, "register_email")
driver.save_screenshot("E:\Imooc\seleniumpython\Imooc_selenium\imooc.png")
code_element = driver.find_element(By.ID, "getcode_num")
print(code_element.location)  # (x:123,y:345)
print(code_element.size)
# 描绘出来ABCD四个点
left = code_element.location['x'] * 2  # A
top = code_element.location['y'] * 2  # C
right = code_element.size['width']*2+left  # B
down = code_element.size['height']*2+top  # D
im = Image.open("E:\Imooc\seleniumpython\Imooc_selenium\imooc.png")
img = im.crop((left, top, right, down))
img.save("E:\Imooc\seleniumpython\Imooc_selenium\imooc1.png")

识别验证码!用超级鹰!

import requests
from hashlib import md5
#Chaojiying_Client已经封装在了文件夹的识别程序,直接调用就行
from Chaojiying_Client import Chaojiying_Client
#超级鹰用户名,密码,id
chaojiying = Chaojiying_Client('zhangyujie', 'qwer1234', '950821')
im = open('E:/Imooc/seleniumpython/Imooc_selenium/test02.png', 'rb').read()
#1902是识别验证码的类型,可以去文档里找
text = chaojiying.PostPic(im, 1902)['pic_str']
print(text)

注册流程代码封装,把每一个模块封装成一个个函数

# coding=utf-8
from selenium import webdriver
import time
import random
import requests
from PIL import Image
from selenium.webdriver.common.by import By
from hashlib import md5
from Chaojiying_Client import Chaojiying_Client

driver = webdriver.Chrome()
# 浏览器初始化


def driver_init():
    driver.get("http://www.5itest.cn/register")
    driver.maximize_window()
    time.sleep(5)

# 获取element信息


def get_element(id):
    element = driver.find_element(By.ID, id)
    return element

# 获取随机数


def get_range_user():
    user_info = ''.join(random.sample('1234567890abcdefghijklmn', 8))
    return user_info

# 获取图片


def get_code_image(file_name):
    driver.save_screenshot(file_name)
    code_element = driver.find_element(By.ID, "getcode_num")
    left = code_element.location['x']*2
    top = code_element.location['y']*2
    right = code_element.size['width']*2+left
    height = code_element.size['height']*2+top
    im = Image.open(file_name)
    img = im.crop((left, top, right, height))
    img.save(file_name)

# 解析图片获取验证码


def code_online(file_name):
    chaojiying = Chaojiying_Client('zhangyujie', 'qwer1234', '950821')
    im = open(file_name, 'rb').read()
    text = chaojiying.PostPic(im, 1902)['pic_str']
    return text

# 运行主程序


def run_main():
    user_name_info = get_range_user()
    user_email = user_name_info+"@163.com"
    file_name = "E:/Imooc/seleniumpython/Imooc_selenium/test02.png"
    driver_init()
    get_element("register_email").send_keys(user_email)
    get_element("register_nickname").send_keys(user_name_info)
    get_element("register_password").send_keys("111111")
    get_code_image(file_name)
    text = code_online(file_name)
    get_element("captcha_code").send_keys(text)
    get_element("register-btn").click()
    time.sleep(5)
    driver.close()


run_main()

以配置文件形式实现定位设计思想(因为用户名邮箱密码有可能是会变 的)

新建一个config文件夹,在里面新建一个LocalElement.ini文件作为配置文件,把用户信息写进去

[RegisterElement]
user_email=id>register_email
user_email_error=id>register_email-error
user_name=id>register_nickname
user_name_error=id>register_nickname-error
password=id>register_password
password_error=id>register_password-error
code_image=id>getcode_num
code_text=id>captcha_code
code_text_error=id>captcha_code-error
register_button=id>register-btn

怎么读取配置文件呢?新建init.py

# coding=utf-8
import configparser


class ReadIni(object):
    # 初始化下面函数里的参数变量
    def __init__(self, file_name=None, node=None):
        if file_name == None:
            file_name = "e:/Imooc/seleniumpython/config/LocalElement.ini"
        if node == None:
            self.node = 'RegisterElement'
        else:
            self.node = node
        self.cf = self.load_ini(file_name)
# 加载文件

    def load_ini(self, file_name):
        cf = configparser.ConfigParser()
        # 这里的地址是活的,不能写死;所以把"e:/Imooc/seleniumpython/config/LocalElement.ini"换成file_name
        cf.read(file_name)
        return cf
# 获取value值

    def get_value(self, key):
        data = self.cf.get(self.node, key)
        return data


if __name__ == '__main__':
    read_init = ReadIni()
    print(read_init.get_value('user_name'))

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值