zoukankan      html  css  js  c++  java
  • selenium3 web自动化测试框架 二:页面基础操作、元素定位方法封装、页面操作方法封装

    学习目的:

    掌握自动化框架中需要的一些基础web操作

    正式步骤:

    使用title_contains检查页面是否正确


    # -*-  coding:utf-8 -*-
    import time
    from selenium import webdriver
    from selenium.webdriver.support import expected_conditions as EC
    
    dr = webdriver.Chrome()
    url = "https://www.baidu.com"
    dr.get(url)
    #校验title是否包含校验的内容
    a = EC.title_contains("百度一下,你就知道")
    #如果包含括号内的内容,则会打印
    if a:
        print("title正确")
    time.sleep(3)
    dr.close()

    使用Expected_conditions判断元素是否可见


    # -*-  coding:utf-8 -*-
    
    import time
    from selenium import webdriver
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.common.by import By
    
    url = "http://www.5itest.cn/register"
    dr = webdriver.Chrome()
    dr.get(url)
    time.sleep(3)
    EC.title_contains("注册")
    
    #注册输入操作,如果用element直接传参到WebDriverWait会报错,提示需要传入一个可迭代对象,而不是webelement,所以传入locator
    element = dr.find_element_by_xpath('//*[@id="register_email"]')
    locator = (By.XPATH,'//*[@id="register_email"]')
    WebDriverWait(dr,10).until(EC.visibility_of_element_located(locator))
    element.send_keys("111@163.com")
    
    time.sleep(3)
    dr.close()

     获取定位的标签属性或者输入的内容


    # -*-  coding:utf-8 -*-
    import time
    from selenium import webdriver
    from selenium.webdriver.support import expected_conditions as EC
    
    url = "http://www.5itest.cn/register"
    dr = webdriver.Chrome()
    dr.get(url)
    time.sleep(3)
    EC.title_contains("注册")
    
    email_element = dr.find_element_by_xpath('//*[@id="register_email"]')
    #打印定位了email的标签其他元素属性
    print(email_element.get_attribute("placeholder"))
    email_element.send_keys("test@163.com")
    #获取输入的内容,查看是否输入正确
    text = email_element.get_attribute("value")
    assert text == "test@163.com"
    
    time.sleep(1)
    dr.quit()

    随机生成数据:用户名、邮箱账号 


    # -*-  coding:utf-8 -*-
    import random
    import time
    from selenium import webdriver
    
    url = "http://www.5itest.cn/register"
    dr = webdriver.Chrome()
    dr.get(url)
    time.sleep(3)
    #Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
    data_email = ''.join(random.sample("123456789abcdefg",6))+'@163.com'
    data_name = ''.join(random.sample("AaBbCcDdEeFf",4))
    dr.find_element_by_xpath('//*[@id="register_email"]').send_keys(data_email)
    dr.find_element_by_xpath('//*[@id="register_nickname"]').send_keys(data_name)
    time.sleep(3)
    dr.close()

    解决验证码--获取验证码图片


    # -*-  coding:utf-8 -*-
    
    import time
    import random
    from PIL import Image
    from selenium import webdriver
    from selenium.webdriver.support import expected_conditions as EC
    from  selenium.webdriver.common.by import By
    from  selenium.webdriver.support.wait import WebDriverWait
    
    url = "http://www.5itest.cn/register"
    dr = webdriver.Chrome()
    dr.get(url)
    dr.maximize_window()
    time.sleep(3)
    element_email = dr.find_element_by_xpath('//*[@id="register_email"]')
    elemant_name = dr.find_element_by_xpath('//*[@id="register_nickname"]')
    elemant_pwd = dr.find_element_by_xpath('//*[@id="register_password"]')
    data_email = ''.join(random.sample('asdzxc123456',6))
    data_name = ''.join(random.sample('BNMGHJ',4))
    locator = (By.XPATH,'//*[@id="register_email"]')
    WebDriverWait(dr,10).until(EC.visibility_of_element_located(locator))
    element_email.send_keys(data_email+'@163.com')
    elemant_name.send_keys(data_name)
    elemant_pwd.send_keys('111111')
    
    #图片处理
    dr.save_screenshot(r"F:python_stackpython_autotest
    um.png")
    element_code = dr.find_element_by_xpath('//*[@id="getcode_num"]')
    print(element_code.location)
    code_left = element_code.location['x']
    code_top = element_code.location['y']
    code_right = element_code.size['width']+code_left
    code_bottom = element_code.size['height'] + code_top
    #打开页面的截图
    im = Image.open("F:/python_stack/python_autotest/num.png")
    #根据上下左右的坐标,来截取验证码图片
    img = im.crop((code_left,code_top,code_right,code_bottom))
    img.save("F:/python_stack/python_autotest/num_code.png")
    
    time.sleep(3)
    dr.close()

    从验证码图片获取验证码


    import pytesseract
    from PIL import Image
    
    img = Image.open("F:/python_stack/python_autotest/num_code.png")
    text = pytesseract.image_to_string(img)
    print(text)

    PS:

    如果报错:tesseract is not installed or it's not in your path

    请自己下载一个Tesseract-OCR

    可以参考:https://blog.csdn.net/qq_42184699/article/details/92575404 

    重构封装读取配置文件方法


    配置文件内容:

    [RegisterElement]
    element_email=id>register_email
    elemant_name=id>register_nickname
    elemant_pwd=id>register_password
    [/RegisterElement]

    读取配置文件代码:

    # -*-  coding:utf-8 -*-
    '''
    pip install Configparser 安装参数解析读取的包
    '''
    
    import configparser
    
    class ReadIni(object):
        def __init__(self,filename = None,node= None):
            if filename == None:
                filename = "F:/python_stack/python_autotest/config/LocalElement.ini"
            if node == None:
                self.node = "RegisterElement"
            else:
                self.node = node
            self.cf = self.load_ini(filename)
    #加载文件
        def load_ini(self,filename):
            cf = configparser.ConfigParser()
            cf.read(filename)
            return cf
    #获取value值
        def get_value(self,key):
            data = self.cf.get(self.node,key)
            return data
    
    
    if __name__ == "__main__":
        test = ReadIni()
        print(test.get_value("elemant_pwd"))

    封装定位元素类 : find_elemnet.py


    # -*-  coding:utf-8 -*-
    from util.ReadIni import ReadIni
    from selenium import webdriver
    
    
    class FindElement(object):
        def __init__(self, driver):
            self.driver = driver
    
        def get_element(self, key):
            readini = ReadIni()
            data = readini.get_value(key)
            by = data.split(">")[0]
            # print(by)
            value = data.split(">")[1]
            # print(value)
            try:
                if by == 'id':
                    return self.driver.find_element_by_id(value)
                elif by == "name":
                    return self.driver.find_element_by_name(value)
                elif by == "className":
                    return self.driver.find_element_by_className(value)
                else:
                    return self.driver.find_element_by_xpath(value)
            except:
                return None
    
    
    if __name__ == "__main__":
        driver = webdriver.Chrome()
        test = FindElement(driver)
        test.get_element("element_email")
    

      

    页面注册方法封装示例


    # -*-  coding:utf-8 -*-
    from util.find_elemnet import FindElement
    from selenium import webdriver
    
    
    class RegisterFunction(object):
        def __init__(self,url):
            self.driver = self.get_driver(url)
    
    
        #获取driver,并打开网页
        def get_driver(self,url):
            driver = webdriver.Chrome()
            driver.get(url)
            driver.maximize_window()
            return driver
    
        #输入用户信息
        def send_user_info(self,key,data):
            self.get_user_element(key).send_keys(data)
    
        #定位用户的各个element,find_element为find_element.py的实例,然后把实例化的self.driver传入
        #然后find_element就可以正常定位
        def get_user_element(self,key):
            find_element = FindElement(self.driver)
            user_element = find_element.get_element(key)
            return user_element
    
        def main(self):
            self.send_user_info("element_email","test@163.com")
            self.send_user_info("elemant_name","admin")
            self.send_user_info("elemant_pwd", "111111")
    
    
    if __name__ == "__main__":
        url = "http://www.5itest.cn/register"
        register = RegisterFunction(url)
        register.main()

    总结:

    页面的常用方法建议本地建立一个方法库表格,后续直接参考,这个是后续要写的

  • 相关阅读:
    JQuery EasyUI属性和常见用法
    iOS 设置随意屏幕旋转
    iOS 打印系统字体
    iOS 实时监测网络状态(通过Reachability)
    UITableView上添加按钮,按钮点击效果延迟的解决办法
    ios下通过webservice获取数据
    (转发)InputAccessoryView的使用方法
    (转发)IOS动画中的枚举UIViewAnimationOptions
    (转发)IOS高级开发~Runtime(四)
    (转发)IOS高级开发~Runtime(三)
  • 原文地址:https://www.cnblogs.com/wuzhiming/p/11657091.html
Copyright © 2011-2022 走看看