def use_js(self, js): """调用js""" try: self.driver.execute_script(js) except BaseException: log1.error("js执行错误")
def find_element(self, selector): by = selector[0] value = selector[1] element = None if by == 'id' or by == 'name' or by == 'class' or by == 'tag' or by == 'link' or by == 'plink' or by == 'css' or by == 'xpath': if by == 'id': element = self.driver.find_element_by_id(value) elif by == 'name': element = self.driver.find_element_by_name(value) elif by == 'class': element = self.driver.find_element_by_class_name(value) elif by == 'tag': element = self.driver.find_element_by_tag_name(value) elif by == 'link': element = self.driver.find_element_by_link_text(value) elif by == 'plink': element = self.driver.find_element_by_partial_link_text(value) elif by == 'css': element = self.driver.find_element_by_css_selector(value) elif by == 'xpath': element = self.driver.find_element_by_xpath(value) else: log1.error('没有找到元素') return element else: log1.error("输入的元素定位方式错误")
def open_browser(self, browser): log1.info('读取浏览器配置') url = Config.config_read('test', 'url') log1.info('读取url:%s' % url) try: if browser == 0: abspath = os.path.abspath(r"F:\m2\chromedriver.exe") self.driver = webdriver.Chrome(abspath) log1.info('打开的浏览器为chrome') elif browser == 1: # abspath = os.path.abspath(r"F:\m2\chromedriver.exe") self.driver = webdriver.Firefox() log1.info('打开的浏览器为Firefox') elif browser == 2: # abspath = os.path.abspath(r"F:\m2\chromedriver.exe") self.driver = webdriver.ie() log1.info('打开的浏览器为ie') self.driver.get(url) self.driver.maximize_window() log1.info('浏览器最大化') self.driver.implicitly_wait(10) log1.info('设置静态等待时间10秒') return self.driver except BaseException: log1.error('浏览器打开报错')
def switch_iframe(self, selector): """切换frame""" element = self.driver.find_element(selector) try: self.driver.switch_to.frame(element) except: log1.error("切换frame报错")
def use_js(self, js): """调用js""" # noinspection PyBroadException try: self.driver.execute_script(js) log1.info('js执行成功,js内容为:%s' % js) except BaseException: log1.error('js执行报错', exc_info=1)
def switch_ifarme(self, selector): """切换farm""" element = self.find_element(selector) # noinspection PyBroadException try: self.driver.switch_to.frame(element) log1.info('切换frame成功') except BaseException: log1.error('切换frame报错', exc_info=1)
def send(self, selector, value): element = self.find_element(selector) # 调用封装的定位元素方法 element.clear() try: element.send_keys(value) log1.info('输入的内容%s' % value) except BaseException: log1.error('输入内容出错') self.get_img()
def get_img(self): """截图""" path = os.path.join(getcwd.getcwd(), 'screenshots\\') # 拼接截图保存路径 rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time())) # 按格式获取当前时间 screen_name = path + rq + '.png' # 拼接截图名称 try: self.driver.get_screenshot_as_file(screen_name) log1.info("截图成功:%s" % screen_name) except BaseException: log1.error("截图失败:%s" % screen_name)
def post(self, url, data=None, headers=None, files=None): '''封装post请求,return响应码和响应内容''' try: r = requests.post(url, data=data, headers=headers, files=files) log1.info("请求的内容:%s" % data) status_code = r.status_code # 获取返回的状态码 log1.info("获取返回的状态码:%d" % status_code) response_json = r.json() # 响应内容,json类型转化成python数据类型 log1.info("响应内容:%s" % response_json) return status_code, response_json # 返回响应码,响应内容 except BaseException as e: log1.error("请求失败!", exc_info=1)
def type(self, selector, value): """输入内容""" element = self.find_element(selector) element.clear() log1.info('清空输入内容') # noinspection PyBroadException try: element.send_keys(value) log1.info('输入的内容:%s' % value) except BaseException: log1.error('内容输入报错', exc_info=1) self.get_img()
def get_img(self): """截图""" path = os.path.join(getcwd.get_cwd(), 'screenshots/') # 拼接截图保存路径 rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time())) # 按格式获取当前时间 screen_name = path + rq + '.png' # 拼接截图文件名 # noinspection PyBroadException try: self.driver.get_screenshot_as_file(screen_name) log1.info("截图保存成功") except BaseException: log1.error("截图失败", exc_info=1)
def click(self, selector): element = self.find_element(selector) try: element.click() except BaseException: display = self.is_displayed(element) if display: self.framework_sleep(3) element.click() else: self.get_img() log1.error("点击元素错误")
def post_json(self, url, data=None, headers=None): '''封装post方法,并用json格式传值,return响应码和响应内容''' try: data = json.dumps(data).encode('utf-8') # python数据类型转化为json数据类型 r = requests.post(url, data=data, headers=headers) log1.info("请求的内容:%s" % data) status_code = r.status_code # 获取返回的状态码 log1.info("获取返回的状态码:%d" % status_code) response = r.json() # 响应内容,json类型转化成python数据类型 log1.info("响应内容:%s" % response) return status_code, response # 返回响应码,响应内容 except BaseException as e: log1.error("请求失败!", exc_info=1)
def get(self, url, params=None, headers=None, files=None): '''封装get方法,return响应码和相应内容''' try: r = requests.get(url, params=params, headers=headers, files=files) log1.info("请求的内容:%s" % params) status_code = r.status_code # 获取返回的状态码 log1.info("获取返回的状态码:%d" % status_code) response_json = r.json() # 响应内容,json类型转化成python数据类型 log1.info("响应内容:%s" % response_json) reurl = r.url # 获取返回的状态码 log1.info("url为:%s" % reurl) return status_code, response_json, reurl except BaseException as e: log1.error("请求失败!", exc_info=1)
def switch_menue(self, parentelement, secelement, targetelement): """三级菜单切换""" self.my_sleep(3) # noinspection PyBroadException try: self.driver.switch_to_default_content() self.click(parentelement) log1.info('成功点击一级菜单:%s' % parentelement) self.click(secelement) log1.info('成功点击二级菜单:%s' % secelement) self.click(targetelement) log1.info('成功点击三级菜单:%s' % targetelement) except BaseException: log1.error('切换菜单报错', exc_info=1)
def click(self, selector): """点击元素""" element = self.find_element(selector) # noinspection PyBroadException try: element.click() log1.info('点击元素成功') except BaseException: display = self.isdisplayed(element) if display is True: self.my_sleep(3) element.click() log1.info('点击元素成功') else: self.get_img() log1.error('点击元素报错', exc_info=1)
def open_browser(self): browser = self.config_get('browser', 'environment') log1.info('读取浏览器配置') url = self.config_get('url') log1.info('读取url:%s' % url) try: if browser == str(0): self.driver = webdriver.Chrome() log1.info('打开的浏览器为Chrome') elif browser == str(1): self.driver = webdriver.Firefox() log1.info('打开的浏览器为Firefox') self.driver.get(url) self.driver.maximize_window() log1.info('浏览器最大化') self.driver.implicitly_wait(10) log1.info('设置静态等待时间10秒') return self.driver except BaseException: log1.error('浏览器打开报错')
def mail(): try: # 创建一个带附件的实例 message = MIMEMultipart() message['From'] = formataddr(['发件人姓名', sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号 log1.info('发件人邮箱:%s' % sender) message['To'] = formataddr(['收件人姓名', addressed_eamil]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号 log1.info('收件人邮箱:%s' % addressed_eamil) message['Subject'] = rq + "xxxUI自动化测试报告" # 邮件的主题,也可以说是标题 # 邮件正文内容 message.attach(MIMEText('附件为xxxUI自动化测试报告', 'plain', 'utf-8')) # 构造附件1 att1 = MIMEText(open(file, 'rb').read(), 'base64', 'utf-8') log1.info('读取附件') att1["Content-Type"] = 'application/octet-stream' # filename是附件名,附件名称为中文时的写法 att1.add_header("Content-Disposition", "attachment", filename=("gbk", "", "钱东敏测试自动化框架报告.html")) # 附件名称非中文时的写法 # att["Content-Disposition"] = 'attachment; filename="test.html")' message.attach(att1) log1.info('添加附件') server = smtplib.SMTP_SSL( "smtp.yeah.net", 465) # 发件人邮箱中的SMTP服务器,ssl端口一般为465, 非ssl一般端口是25 log1.info('连接yeah邮箱smtp服务') server.login(sender, password) # 括号中对应的是发件人邮箱账号、邮箱密码 log1.info('连接成功') server.sendmail(sender, addressed_eamil, message.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件 server.quit() # 关闭连接 log1.info("邮件发送成功") except Exception: log1.error("邮件发送失败", exc_info=1)
def test_weather(self): '''查询天气''' case_name = '查询天气' log1.info("执行测试用例:%s" % case_name) try: weather = test_requests() # 初始化测试基类的实例 url = Config.config_read('weathere', 'url') # 获取配置文件中的url city = Config.config_read('weathere', 'city') # 获取配置文件中的crty status_code, response_json, reurl = weather.get( url + city) # 调用封装的get方法,接收状态码和相应内容 message = weather.getdict(response_json, 'message') # 调用迭代字典方法,获得message字段的值 test1 = self.assertEqual(status_code, 200) # 断言状态码等于200 print(test1) test2 = self.assertEqual(message, 'Success !') # 断言message字段的值等于'Success !' print(test2) if test1 == None and test2 == None: # 如果两个断言结果都等于None log1.info("测试通过") except BaseException as f: log1.error("测试用例执行出错: %s" % case_name, exc_info=1) raise
def find_element(self, selector): """定位元素""" by = selector[0] value = selector[1] element = None if by in [ 'id', 'name', 'class', 'tag', 'link', 'plink', 'css', 'xpath', 'andriod_uiautomator' ]: # noinspection PyBroadException try: if by == 'id': element = self.driver.find_element_by_id(value) elif by == 'name': element = self.driver.find_element_by_name(value) elif by == 'class': element = self.driver.find_element_by_class_name(value) elif by == 'tag': element = self.driver.find_element_by_tag_name(value) elif by == 'link': element = self.driver.find_element_by_link_text(value) elif by == 'plink': element = self.driver.find_element_by_partial_link_text( value) elif by == 'css': element = self.driver.find_element_by_css_selector(value) elif by == 'xpath': element = self.driver.find_element_by_xpath(value) elif by == 'andriod_uiautomator': element = self.driver.find_element_by_andriod_uiautomator( value) else: log1.error('没有找到元素') log1.info('元素定位成功。定位方式:%s,使用的值%s:' % (by, value)) return element except NoSuchElementException: log1.error("报错信息:", exc_info=1) self.get_img() # 调用截图 else: log1.error('输入的元素定位方式错误')
from logs.log import log1 try: log1.info("测试") except: log1.error("123")