Commit 987bbc5d authored by gaotao's avatar gaotao

代码结构变动

parent 5b5d96f4
from engine.browser_engine import BrowserEngine
from engine.read_config import ReadConfig
from engine.logger import Logger
import os,time
def get_engine(file, url):
def inner(f):
def wapper(*args, **kwargs):
try:
start_time = time.time()
log_name = os.path.split(file)[-1].split(".")[0]
image_path = os.path.join(os.path.dirname(os.path.dirname(file)), "images")
image_path = os.path.join(image_path, log_name)
image_path += '.png'
engine = BrowserEngine(image_path, log_name, url)
ret = f(engine, *args, **kwargs)
end_time = time.time()
engine.logger.info(f'执行时间:{end_time-start_time}s')
if engine: del engine
return ret
except Exception as e:
print(e)
return wapper
return inner
# -*- coding:utf-8 -*-
from selenium import webdriver
from basepage.read_config import ReadConfig
import time
import string
from basepage.logger import Logger
from engine.read_config import ReadConfig
import time, os, re
class BrowserEngine(ReadConfig):
__log_name = "browser_engine"
def __init__(self, log_name=__log_name,url='URL'):
def __init__(self, image_path, log_name=__log_name, url='URL'):
super().__init__(log_name)
# self.__logger = super().get_logger()
self._log_name = log_name
self._browser = ''
self.url = url
self._driver_path = r"C:\Users\80980\znfz_autotest\driver\chromedriver.exe"
self.image_path = image_path
# def init(self):
self.driver = webdriver.Chrome(self._driver_path)
self.open_browser()
self.login_znfz()
self.get_page()
self.driver.xpath = self.driver.find_elements_by_xpath
def open_browser(self):
browser = self.get_browserType('browserName')
url = self.get_testUrl('URL')
......@@ -42,7 +40,7 @@ class BrowserEngine(ReadConfig):
return self.driver
def login_znfz(self):
if self.url =='LOGIN':
if self.url == 'LOGIN':
return
username = self.get_userInfo('username')
password = self.get_userInfo('password')
......@@ -58,7 +56,8 @@ class BrowserEngine(ReadConfig):
self.driver.find_element_by_xpath('//*[@id="rc-tree-select-list_1"]/ul/li/ul/li[3]/span[1]').click()
tags2 = self.driver.find_element_by_xpath('//*[@id="rc-tree-select-list_1"]/ul/li/ul/li[3]/ul/li[3]/span[2]/span')
tags2 = self.driver.find_element_by_xpath(
'//*[@id="rc-tree-select-list_1"]/ul/li/ul/li[3]/ul/li[3]/span[2]/span')
self.logger.info("tags2.text:%s" % tags2.text)
# print(tags2.text)
tags2.click()
......@@ -79,6 +78,19 @@ class BrowserEngine(ReadConfig):
self.logger.info("the testUrl : %s" % url)
self.driver.get(url)
def load_image(self):
print(self.image_path)
image_dir, image_name = os.path.split(self.image_path)
image_list = os.listdir(image_dir)
if image_name in image_list:
image_name_list = list(filter(lambda x: re.findall(image_name + r'-\d{1,}\.png', x), image_list))
image_name_index_list = list(map(lambda x: int(x.split('-|.')[-2]) if '-' in x else 0, image_name_list))
next_image_name_index = max(image_name_index_list) + 1 if image_name_index_list else 1
next_image_name = os.path.join(image_dir, image_name.replace('.png', f'-{next_image_name_index}.png'))
else:
next_image_name = self.image_path
print(next_image_name)
self.driver.get_screenshot_as_file(next_image_name)
def __del__(self):
try:
......
......@@ -9,13 +9,14 @@ class Logger(object):
super().__init__(*args, **kwargs)
self.log_name = log_name
self.logger = logging.getLogger(log_name)
self.logger.handlers = []
self.init_logger()
def init_logger(self, ):
def init_logger(self):
self.logger.setLevel(logging.DEBUG)
rq = time.strftime('%Y%m%d', time.localtime(time.time()))
log_path = os.path.dirname(os.path.abspath('.')) + '/logs/'
log_path = os.path.dirname(os.path.abspath('..')) + '/logs/'
log_name = log_path + rq + '.log'
fh = logging.FileHandler(log_name)
fh.setLevel(logging.INFO)
......@@ -32,5 +33,6 @@ class Logger(object):
def get_logger(self):
return self.logger
# def getlog(self):
# return self.logger
import os
import configparser
from basepage.logger import Logger
from engine.logger import Logger
'''
proDir = os.path.split(os.path.realpath(__file__))[0]
......@@ -24,8 +24,8 @@ class ReadConfig(Logger):
self.cf.read(self._configPath, encoding="utf-8-sig")
def join_config_path(self):
proDir = os.path.dirname(os.path.abspath('.'))
self._configPath = os.path.dirname(os.path.abspath('.')) + r'\config\config.ini'
# proDir = os.path.dirname(os.path.abspath('.'))
self._configPath = os.path.dirname(os.path.abspath('..')) + r'\config\config.ini'
self.logger.info("the configPath: %s" % self._configPath)
def get_browserType(self, param):
......
from selenium import webdriver
import pytest
# driver = None
# @pytest.mark.hookwrapper
# def pytest_runtest_makereport(item):
# """
# Extends the PyTest Plugin to take and embed screenshot in html report, whenever test fails.
# :param item:
# """
# pytest_html = item.config.pluginmanager.getplugin('html')
# outcome = yield
# report = outcome.get_result()
# extra = getattr(report, 'extra', [])
#
# if report.when == 'call' or report.when == "setup":
# xfail = hasattr(report, 'wasxfail')
# if (report.skipped and xfail) or (report.failed and not xfail):
# file_name = report.nodeid.replace("::", "_")+".png"
# _capture_screenshot(file_name)
# if file_name:
# html = '<div><img src="%s" alt="screenshot" style="width:304px;height:228px;" ' \
# 'οnclick="window.open(this.src)" align="right"/></div>' % file_name
# extra.append(pytest_html.extras.html(html))
# report.extra = extra
#
#
# def _capture_screenshot(name):
# driver.get_screenshot_as_file(name)
#
#
# @pytest.fixture(scope='session', autouse=True)
# def browser():
# global driver
# if driver is None:
# driver = webdriver.Firefox()
# return driver
body {
font-family: Helvetica, Arial, sans-serif;
font-size: 12px;
/* do not increase min-width as some may use split screens */
min-width: 800px;
color: #999;
}
h1 {
font-size: 24px;
color: black;
}
h2 {
font-size: 16px;
color: black;
}
p {
color: black;
}
a {
color: #999;
}
table {
border-collapse: collapse;
}
/******************************
* SUMMARY INFORMATION
******************************/
#environment td {
padding: 5px;
border: 1px solid #E6E6E6;
}
#environment tr:nth-child(odd) {
background-color: #f6f6f6;
}
/******************************
* TEST RESULT COLORS
******************************/
span.passed, .passed .col-result {
color: green;
}
span.skipped, span.xfailed, span.rerun, .skipped .col-result, .xfailed .col-result, .rerun .col-result {
color: orange;
}
span.error, span.failed, span.xpassed, .error .col-result, .failed .col-result, .xpassed .col-result {
color: red;
}
/******************************
* RESULTS TABLE
*
* 1. Table Layout
* 2. Extra
* 3. Sorting items
*
******************************/
/*------------------
* 1. Table Layout
*------------------*/
#results-table {
border: 1px solid #e6e6e6;
color: #999;
font-size: 12px;
width: 100%
}
#results-table th, #results-table td {
padding: 5px;
border: 1px solid #E6E6E6;
text-align: left
}
#results-table th {
font-weight: bold
}
/*------------------
* 2. Extra
*------------------*/
.log:only-child {
height: inherit
}
.log {
background-color: #e6e6e6;
border: 1px solid #e6e6e6;
color: black;
display: block;
font-family: "Courier New", Courier, monospace;
height: 230px;
overflow-y: scroll;
padding: 5px;
white-space: pre-wrap
}
div.image {
border: 1px solid #e6e6e6;
float: right;
height: 240px;
margin-left: 5px;
overflow: hidden;
width: 320px
}
div.image img {
width: 320px
}
div.video {
border: 1px solid #e6e6e6;
float: right;
height: 240px;
margin-left: 5px;
overflow: hidden;
width: 320px
}
div.video video {
overflow: hidden;
width: 320px;
height: 240px;
}
.collapsed {
display: none;
}
.expander::after {
content: " (show details)";
color: #BBB;
font-style: italic;
cursor: pointer;
}
.collapser::after {
content: " (hide details)";
color: #BBB;
font-style: italic;
cursor: pointer;
}
/*------------------
* 3. Sorting items
*------------------*/
.sortable {
cursor: pointer;
}
.sort-icon {
font-size: 0px;
float: left;
margin-right: 5px;
margin-top: 5px;
/*triangle*/
width: 0;
height: 0;
border-left: 8px solid transparent;
border-right: 8px solid transparent;
}
.inactive .sort-icon {
/*finish triangle*/
border-top: 8px solid #E6E6E6;
}
.asc.active .sort-icon {
/*finish triangle*/
border-bottom: 8px solid #999;
}
.desc.active .sort-icon {
/*finish triangle*/
border-top: 8px solid #999;
}
[pytest]
;log_format = %(asctime)s %(levelname)s %(message)s
log_date_format = %Y-%m-%d %H:%M:%S
markers= login
select
addxyr
delxyr
gsjd
case4
case5
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Test Report</title>
<link href="assets/style.css" rel="stylesheet" type="text/css"/></head>
<body onLoad="init()">
<script>/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
function toArray(iter) {
if (iter === null) {
return null;
}
return Array.prototype.slice.call(iter);
}
function find(selector, elem) {
if (!elem) {
elem = document;
}
return elem.querySelector(selector);
}
function find_all(selector, elem) {
if (!elem) {
elem = document;
}
return toArray(elem.querySelectorAll(selector));
}
function sort_column(elem) {
toggle_sort_states(elem);
var colIndex = toArray(elem.parentNode.childNodes).indexOf(elem);
var key;
if (elem.classList.contains('numeric')) {
key = key_num;
} else if (elem.classList.contains('result')) {
key = key_result;
} else {
key = key_alpha;
}
sort_table(elem, key(colIndex));
}
function show_all_extras() {
find_all('.col-result').forEach(show_extras);
}
function hide_all_extras() {
find_all('.col-result').forEach(hide_extras);
}
function show_extras(colresult_elem) {
var extras = colresult_elem.parentNode.nextElementSibling;
var expandcollapse = colresult_elem.firstElementChild;
extras.classList.remove("collapsed");
expandcollapse.classList.remove("expander");
expandcollapse.classList.add("collapser");
}
function hide_extras(colresult_elem) {
var extras = colresult_elem.parentNode.nextElementSibling;
var expandcollapse = colresult_elem.firstElementChild;
extras.classList.add("collapsed");
expandcollapse.classList.remove("collapser");
expandcollapse.classList.add("expander");
}
function show_filters() {
var filter_items = document.getElementsByClassName('filter');
for (var i = 0; i < filter_items.length; i++)
filter_items[i].hidden = false;
}
function add_collapse() {
// Add links for show/hide all
var resulttable = find('table#results-table');
var showhideall = document.createElement("p");
showhideall.innerHTML = '<a href="javascript:show_all_extras()">Show all details</a> / ' +
'<a href="javascript:hide_all_extras()">Hide all details</a>';
resulttable.parentElement.insertBefore(showhideall, resulttable);
// Add show/hide link to each result
find_all('.col-result').forEach(function(elem) {
var collapsed = get_query_parameter('collapsed') || 'Passed';
var extras = elem.parentNode.nextElementSibling;
var expandcollapse = document.createElement("span");
if (extras.classList.contains("collapsed")) {
expandcollapse.classList.add("expander")
} else if (collapsed.includes(elem.innerHTML)) {
extras.classList.add("collapsed");
expandcollapse.classList.add("expander");
} else {
expandcollapse.classList.add("collapser");
}
elem.appendChild(expandcollapse);
elem.addEventListener("click", function(event) {
if (event.currentTarget.parentNode.nextElementSibling.classList.contains("collapsed")) {
show_extras(event.currentTarget);
} else {
hide_extras(event.currentTarget);
}
});
})
}
function get_query_parameter(name) {
var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);
return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
}
function init () {
reset_sort_headers();
add_collapse();
show_filters();
sort_column(find('.initial-sort'));
find_all('.sortable').forEach(function(elem) {
elem.addEventListener("click",
function(event) {
sort_column(elem);
}, false)
});
};
function sort_table(clicked, key_func) {
var rows = find_all('.results-table-row');
var reversed = !clicked.classList.contains('asc');
var sorted_rows = sort(rows, key_func, reversed);
/* Whole table is removed here because browsers acts much slower
* when appending existing elements.
*/
var thead = document.getElementById("results-table-head");
document.getElementById('results-table').remove();
var parent = document.createElement("table");
parent.id = "results-table";
parent.appendChild(thead);
sorted_rows.forEach(function(elem) {
parent.appendChild(elem);
});
document.getElementsByTagName("BODY")[0].appendChild(parent);
}
function sort(items, key_func, reversed) {
var sort_array = items.map(function(item, i) {
return [key_func(item), i];
});
sort_array.sort(function(a, b) {
var key_a = a[0];
var key_b = b[0];
if (key_a == key_b) return 0;
if (reversed) {
return (key_a < key_b ? 1 : -1);
} else {
return (key_a > key_b ? 1 : -1);
}
});
return sort_array.map(function(item) {
var index = item[1];
return items[index];
});
}
function key_alpha(col_index) {
return function(elem) {
return elem.childNodes[1].childNodes[col_index].firstChild.data.toLowerCase();
};
}
function key_num(col_index) {
return function(elem) {
return parseFloat(elem.childNodes[1].childNodes[col_index].firstChild.data);
};
}
function key_result(col_index) {
return function(elem) {
var strings = ['Error', 'Failed', 'Rerun', 'XFailed', 'XPassed',
'Skipped', 'Passed'];
return strings.indexOf(elem.childNodes[1].childNodes[col_index].firstChild.data);
};
}
function reset_sort_headers() {
find_all('.sort-icon').forEach(function(elem) {
elem.parentNode.removeChild(elem);
});
find_all('.sortable').forEach(function(elem) {
var icon = document.createElement("div");
icon.className = "sort-icon";
icon.textContent = "vvv";
elem.insertBefore(icon, elem.firstChild);
elem.classList.remove("desc", "active");
elem.classList.add("asc", "inactive");
});
}
function toggle_sort_states(elem) {
//if active, toggle between asc and desc
if (elem.classList.contains('active')) {
elem.classList.toggle('asc');
elem.classList.toggle('desc');
}
//if inactive, reset all other functions and add ascending active
if (elem.classList.contains('inactive')) {
reset_sort_headers();
elem.classList.remove('inactive');
elem.classList.add('active');
}
}
function is_all_rows_hidden(value) {
return value.hidden == false;
}
function filter_table(elem) {
var outcome_att = "data-test-result";
var outcome = elem.getAttribute(outcome_att);
class_outcome = outcome + " results-table-row";
var outcome_rows = document.getElementsByClassName(class_outcome);
for(var i = 0; i < outcome_rows.length; i++){
outcome_rows[i].hidden = !elem.checked;
}
var rows = find_all('.results-table-row').filter(is_all_rows_hidden);
var all_rows_hidden = rows.length == 0 ? true : false;
var not_found_message = document.getElementById("not-found-message");
not_found_message.hidden = !all_rows_hidden;
}
</script>
<h1>report.html</h1>
<p>Report generated on 07-Jul-2020 at 11:54:02 by <a href="https://pypi.python.org/pypi/pytest-html">pytest-html</a> v2.1.1</p>
<h2>Environment</h2>
<table id="environment">
<tr>
<td>Packages</td>
<td>{"pluggy": "0.13.1", "py": "1.8.1", "pytest": "5.4.3"}</td></tr>
<tr>
<td>Platform</td>
<td>Windows-10-10.0.18362-SP0</td></tr>
<tr>
<td>Plugins</td>
<td>{"forked": "1.1.3", "html": "2.1.1", "metadata": "1.9.0", "rerunfailures": "9.0"}</td></tr>
<tr>
<td>Python</td>
<td>3.6.8</td></tr></table>
<h2>Summary</h2>
<p>3 tests ran in 83.68 seconds. </p>
<p class="filter" hidden="true">(Un)check the boxes to filter the results.</p><input checked="true" class="filter" data-test-result="passed" hidden="true" name="filter_checkbox" onChange="filter_table(this)" type="checkbox"/><span class="passed">3 passed</span>, <input checked="true" class="filter" data-test-result="skipped" disabled="true" hidden="true" name="filter_checkbox" onChange="filter_table(this)" type="checkbox"/><span class="skipped">0 skipped</span>, <input checked="true" class="filter" data-test-result="failed" disabled="true" hidden="true" name="filter_checkbox" onChange="filter_table(this)" type="checkbox"/><span class="failed">0 failed</span>, <input checked="true" class="filter" data-test-result="error" disabled="true" hidden="true" name="filter_checkbox" onChange="filter_table(this)" type="checkbox"/><span class="error">0 errors</span>, <input checked="true" class="filter" data-test-result="xfailed" disabled="true" hidden="true" name="filter_checkbox" onChange="filter_table(this)" type="checkbox"/><span class="xfailed">0 expected failures</span>, <input checked="true" class="filter" data-test-result="xpassed" disabled="true" hidden="true" name="filter_checkbox" onChange="filter_table(this)" type="checkbox"/><span class="xpassed">0 unexpected passes</span>, <input checked="true" class="filter" data-test-result="rerun" disabled="true" hidden="true" name="filter_checkbox" onChange="filter_table(this)" type="checkbox"/><span class="rerun">0 rerun</span>
<h2>Results</h2>
<table id="results-table">
<thead id="results-table-head">
<tr>
<th class="sortable result initial-sort" col="result">Result</th>
<th class="sortable" col="name">Test</th>
<th class="sortable numeric" col="duration">Duration</th>
<th>Links</th></tr>
<tr hidden="true" id="not-found-message">
<th colspan="4">No results found. Try to check the filters</th></tr></thead>
<tbody class="passed results-table-row">
<tr>
<td class="col-result">Passed</td>
<td class="col-name">test_login.py::test_login</td>
<td class="col-duration">16.43</td>
<td class="col-links"></td></tr>
<tr>
<td class="extra" colspan="4">
<div class="log"> ------------------------------Captured stdout call------------------------------ <br/>周朝阳 qazwsxedc http://192.168.2.31/cm
<br/> ------------------------------Captured stderr call------------------------------ <br/>[2020-07-07 11:52:38,724] - [ INFO] - [ test_login] - [ read_config.py] - [ 29] - the configPath: C:\Users\80980\znfz_autotest\config\config.ini
[2020-07-07 11:52:41,972] - [ INFO] - [ test_login] - [ read_config.py] - [ 33] - the browserType : Chrome
[2020-07-07 11:52:41,975] - [ INFO] - [ test_login] - [ browser_engine.py] - [ 28] - browserName: Chrome
[2020-07-07 11:52:43,071] - [ INFO] - [ test_login] - [ browser_engine.py] - [ 33] - Open url: http://192.168.2.31/cm
[2020-07-07 11:52:46,198] - [ INFO] - [ test_login] - [ browser_engine.py] - [ 36] - Maximize the current window.
[2020-07-07 11:52:46,204] - [ INFO] - [ test_login] - [ browser_engine.py] - [ 38] - Set implicitly wait 10 seconds.
[2020-07-07 11:52:47,206] - [ INFO] - [ test_login] - [ read_config.py] - [ 43] - the userInfo : 周朝阳
[2020-07-07 11:52:47,206] - [ INFO] - [ test_login] - [ read_config.py] - [ 43] - the userInfo : qazwsxedc
[2020-07-07 11:52:47,206] - [ INFO] - [ test_login] - [ test_login.py] - [ 26] - username: 周朝阳
[2020-07-07 11:52:47,206] - [ INFO] - [ test_login] - [ test_login.py] - [ 27] - password :qazwsxedc
[2020-07-07 11:52:47,206] - [ INFO] - [ test_login] - [ test_login.py] - [ 28] - Open url: http://192.168.2.31/cm
[2020-07-07 11:52:47,242] - [ INFO] - [ test_login] - [ test_login.py] - [ 32] - tags.text:请选择所属部门
[2020-07-07 11:52:48,501] - [ INFO] - [ test_login] - [ test_login.py] - [ 40] - tags2.text:瓯海区院
[2020-07-07 11:52:52,320] - [ INFO] - [ test_login] - [ __init__.py] - [ 23] - 执行时间:13.596333742141724s
<br/> -------------------------------Captured log call-------------------------------- <br/>INFO  test_login:read_config.py:29 the configPath: C:\Users\80980\znfz_autotest\config\config.ini
INFO  test_login:read_config.py:33 the browserType : Chrome
INFO  test_login:browser_engine.py:28 browserName: Chrome
INFO  test_login:browser_engine.py:33 Open url: http://192.168.2.31/cm
INFO  test_login:browser_engine.py:36 Maximize the current window.
INFO  test_login:browser_engine.py:38 Set implicitly wait 10 seconds.
INFO  test_login:read_config.py:43 the userInfo : 周朝阳
INFO  test_login:read_config.py:43 the userInfo : qazwsxedc
INFO  test_login:test_login.py:26 username: 周朝阳
INFO  test_login:test_login.py:27 password :qazwsxedc
INFO  test_login:test_login.py:28 Open url: http://192.168.2.31/cm
INFO  test_login:test_login.py:32 tags.text:请选择所属部门
INFO  test_login:test_login.py:40 tags2.text:瓯海区院
INFO  test_login:__init__.py:23 执行时间:13.596333742141724s<br/></div></td></tr></tbody>
<tbody class="passed results-table-row">
<tr>
<td class="col-result">Passed</td>
<td class="col-name">test_login.py::test_login_pwerr</td>
<td class="col-duration">33.02</td>
<td class="col-links"></td></tr>
<tr>
<td class="extra" colspan="4">
<div class="log"> ------------------------------Captured stdout call------------------------------ <br/>C:\Users\80980\znfz_autotest\tests\images\test_login.png
[WinError 3] 系统找不到指定的路径。: &#x27;C:\\Users\\80980\\znfz_autotest\\tests\\images&#x27;
<br/> ------------------------------Captured stderr call------------------------------ <br/>[2020-07-07 11:52:55,163] - [ INFO] - [ test_login] - [ read_config.py] - [ 29] - the configPath: C:\Users\80980\znfz_autotest\config\config.ini
[2020-07-07 11:52:58,456] - [ INFO] - [ test_login] - [ read_config.py] - [ 33] - the browserType : Chrome
[2020-07-07 11:52:58,456] - [ INFO] - [ test_login] - [ browser_engine.py] - [ 28] - browserName: Chrome
[2020-07-07 11:52:59,454] - [ INFO] - [ test_login] - [ browser_engine.py] - [ 33] - Open url: http://192.168.2.31/cm
[2020-07-07 11:53:02,590] - [ INFO] - [ test_login] - [ browser_engine.py] - [ 36] - Maximize the current window.
[2020-07-07 11:53:02,592] - [ INFO] - [ test_login] - [ browser_engine.py] - [ 38] - Set implicitly wait 10 seconds.
[2020-07-07 11:53:03,592] - [ INFO] - [ test_login] - [ read_config.py] - [ 43] - the userInfo : 周朝阳
[2020-07-07 11:53:03,592] - [ INFO] - [ test_login] - [ read_config.py] - [ 43] - the userInfo : qazwsxedc
[2020-07-07 11:53:03,592] - [ INFO] - [ test_login] - [ test_login.py] - [ 59] - username: 周朝阳
[2020-07-07 11:53:03,593] - [ INFO] - [ test_login] - [ test_login.py] - [ 60] - password :qazwsxedc
[2020-07-07 11:53:03,593] - [ INFO] - [ test_login] - [ test_login.py] - [ 61] - Open url: http://192.168.2.31/cm
[2020-07-07 11:53:03,628] - [ INFO] - [ test_login] - [ test_login.py] - [ 67] - tags.text:请选择所属部门
[2020-07-07 11:53:04,903] - [ INFO] - [ test_login] - [ test_login.py] - [ 75] - tags2.text:瓯海区院
<br/> -------------------------------Captured log call-------------------------------- <br/>INFO  test_login:read_config.py:29 the configPath: C:\Users\80980\znfz_autotest\config\config.ini
INFO  test_login:read_config.py:33 the browserType : Chrome
INFO  test_login:browser_engine.py:28 browserName: Chrome
INFO  test_login:browser_engine.py:33 Open url: http://192.168.2.31/cm
INFO  test_login:browser_engine.py:36 Maximize the current window.
INFO  test_login:browser_engine.py:38 Set implicitly wait 10 seconds.
INFO  test_login:read_config.py:43 the userInfo : 周朝阳
INFO  test_login:read_config.py:43 the userInfo : qazwsxedc
INFO  test_login:test_login.py:59 username: 周朝阳
INFO  test_login:test_login.py:60 password :qazwsxedc
INFO  test_login:test_login.py:61 Open url: http://192.168.2.31/cm
INFO  test_login:test_login.py:67 tags.text:请选择所属部门
INFO  test_login:test_login.py:75 tags2.text:瓯海区院<br/></div></td></tr></tbody>
<tbody class="passed results-table-row">
<tr>
<td class="col-result">Passed</td>
<td class="col-name">test_login.py::test_login_usererr</td>
<td class="col-duration">34.07</td>
<td class="col-links"></td></tr>
<tr>
<td class="extra" colspan="4">
<div class="log"> ------------------------------Captured stderr call------------------------------ <br/>[2020-07-07 11:53:28,188] - [ INFO] - [ test_login] - [ read_config.py] - [ 29] - the configPath: C:\Users\80980\znfz_autotest\config\config.ini
[2020-07-07 11:53:31,363] - [ INFO] - [ test_login] - [ read_config.py] - [ 33] - the browserType : Chrome
[2020-07-07 11:53:31,364] - [ INFO] - [ test_login] - [ browser_engine.py] - [ 28] - browserName: Chrome
[2020-07-07 11:53:32,351] - [ INFO] - [ test_login] - [ browser_engine.py] - [ 33] - Open url: http://192.168.2.31/cm
[2020-07-07 11:53:35,477] - [ INFO] - [ test_login] - [ browser_engine.py] - [ 36] - Maximize the current window.
[2020-07-07 11:53:35,479] - [ INFO] - [ test_login] - [ browser_engine.py] - [ 38] - Set implicitly wait 10 seconds.
[2020-07-07 11:53:36,480] - [ INFO] - [ test_login] - [ read_config.py] - [ 43] - the userInfo : 周朝阳
[2020-07-07 11:53:36,480] - [ INFO] - [ test_login] - [ read_config.py] - [ 43] - the userInfo : qazwsxedc
[2020-07-07 11:53:36,480] - [ INFO] - [ test_login] - [ test_login.py] - [ 107] - username: 周朝阳
[2020-07-07 11:53:36,480] - [ INFO] - [ test_login] - [ test_login.py] - [ 108] - password :qazwsxedc
[2020-07-07 11:53:36,480] - [ INFO] - [ test_login] - [ test_login.py] - [ 109] - Open url: http://192.168.2.31/cm
[2020-07-07 11:53:36,509] - [ INFO] - [ test_login] - [ test_login.py] - [ 115] - tags.text:请选择所属部门
[2020-07-07 11:53:37,765] - [ INFO] - [ test_login] - [ test_login.py] - [ 123] - tags2.text:瓯海区院
[2020-07-07 11:53:59,721] - [ INFO] - [ test_login] - [ test_login.py] - [ 134] - test_login_password_err:不输入账户,返回正确的错误信息,text:请输入账户名!
[2020-07-07 11:54:00,106] - [ INFO] - [ test_login] - [ test_login.py] - [ 141] - test_login_password_err:输入错误账户,返回正确的错误信息,text:账户或密码错误
[2020-07-07 11:54:00,106] - [ INFO] - [ test_login] - [ __init__.py] - [ 23] - 执行时间:31.919700384140015s
<br/> -------------------------------Captured log call-------------------------------- <br/>INFO  test_login:read_config.py:29 the configPath: C:\Users\80980\znfz_autotest\config\config.ini
INFO  test_login:read_config.py:33 the browserType : Chrome
INFO  test_login:browser_engine.py:28 browserName: Chrome
INFO  test_login:browser_engine.py:33 Open url: http://192.168.2.31/cm
INFO  test_login:browser_engine.py:36 Maximize the current window.
INFO  test_login:browser_engine.py:38 Set implicitly wait 10 seconds.
INFO  test_login:read_config.py:43 the userInfo : 周朝阳
INFO  test_login:read_config.py:43 the userInfo : qazwsxedc
INFO  test_login:test_login.py:107 username: 周朝阳
INFO  test_login:test_login.py:108 password :qazwsxedc
INFO  test_login:test_login.py:109 Open url: http://192.168.2.31/cm
INFO  test_login:test_login.py:115 tags.text:请选择所属部门
INFO  test_login:test_login.py:123 tags2.text:瓯海区院
INFO  test_login:test_login.py:134 test_login_password_err:不输入账户,返回正确的错误信息,text:请输入账户名!
INFO  test_login:test_login.py:141 test_login_password_err:输入错误账户,返回正确的错误信息,text:账户或密码错误
INFO  test_login:__init__.py:23 执行时间:31.919700384140015s<br/></div></td></tr></tbody></table></body></html>
\ No newline at end of file
# import pytest
# import sys
#
# sys.path.append('..')
# from basepage.check_gsjd import CheckGsjd
#
# @pytest.mark.gsjd
# def test_gsid_case1():
#
# # browser = BrowserEngine()
# # driver = browser.login_znfz()
#
# test = CheckGsjd('check_gsjd')
# driver = test.choose_gsjd()
# test.choose_gsjd_case()
'''
基本案情-基本情况
'''
import pytest,time
from engine import get_engine
@pytest.mark.addxyr
@get_engine(__file__,'JBAQ_URL')
def test_addxyr(engine):
# engine.init()
basic_url = engine.get_testUrl('JBAQ_URL')
case_id = engine.get_caseId('caseId')
url = basic_url.format(bmsah=case_id)
engine.driver.get(url)
xyr_add = engine.driver.xpath("//div[@class='plus___1ckgY']")
if not xyr_add:
engine.logger.info('没有基本信息!!查看具体情况')
exit(-1)
return
xyr_add = xyr_add[0]
xyr_list = engine.driver.xpath("//div[contains(@class,'item___2HoCU')]")
# 添加犯罪嫌疑人
xyr_add.click()
engine.logger.info('点击添加嫌疑人')
time.sleep(1)
new_xyr_list = engine.driver.xpath("//div[contains(@class,'item___2HoCU')]")
xyr_name = engine.driver.xpath("//div[@title='犯罪嫌疑人姓名']/following-sibling::div[1]//input")[0].get_attribute('value')
assert len(new_xyr_list) - len(xyr_list) == 1 and xyr_name == '','嫌疑人数+1'
# 再加一个
xyr_add.click()
engine.logger.info('点击添加嫌疑人')
time.sleep(1)
new_xyr_list = engine.driver.xpath("//div[contains(@class,'item___2HoCU')]")
xyr_name = engine.driver.xpath("//div[@title='犯罪嫌疑人姓名']/following-sibling::div[1]//input")[0].get_attribute('value')
assert len(new_xyr_list) - len(xyr_list) == 2 and xyr_name == '','嫌疑人数+2'
@pytest.mark.delxyr
@get_engine(__file__,'JBAQ_URL')
def test_addxyr(engine):
xyr_list = engine.driver.xpath("//div[contains(@class,'item___2HoCU')]")
xyr_last = xyr_list[-1]
# 删除犯罪嫌疑人
xyr_last.click()
engine.logger.info('点击最后一个嫌疑人')
xyr_del = engine.driver.xpath("//div[@class='item___2HoCU active___2SHXM']/a[contains(@class,'delete___3-b3m')]")[0]
xyr_del.click()
engine.logger.info('点击X')
time.sleep(0.5)
# 点击否
xyr_del_false = engine.driver.xpath("//div[@class='ant-popover-buttons']/button[@class='ant-btn ant-btn-sm']")[0]
xyr_del_false.click()
engine.logger.info('点击否')
time.sleep(0.5)
new_xyr_list = engine.driver.xpath("//div[contains(@class,'item___2HoCU')]")
assert len(xyr_list) == len(new_xyr_list),'嫌疑人数不变'
xyr_last.click()
xyr_del.click()
engine.logger.info('点击X')
time.sleep(0.5)
# 点击是
xyr_del_true = engine.driver.xpath("//div[@class='ant-popover-buttons']/button[@class='ant-btn ant-btn-primary ant-btn-sm']")[0]
xyr_del_true.click()
engine.logger.info('点击是')
time.sleep(1)
new_xyr_list = engine.driver.xpath("//div[contains(@class,'item___2HoCU')]")
assert len(xyr_list) - len(new_xyr_list) == 1,'嫌疑人数-1'
import pytest
import time
import sys
# sys.path.append('../..')
from engine import get_engine
project_name = "TestLogin"
# logger = Logger(project_name).get_logger()
'''
def setup_function():
print('setup_function:每个用例开始前都会执行')
def teardown_function():
print('teardown_function:每个用例结束后都会执行')
'''
@pytest.mark.login
@get_engine(__file__, 'LOGIN')
def test_login(engine):
username = engine.get_userInfo('username')
password = engine.get_userInfo('password')
url = engine.get_testUrl('URL')
print(username, password, url)
engine.logger.info("username: %s" % username)
engine.logger.info("password :%s" % password)
engine.logger.info("Open url: %s" % url)
tags = engine.driver.find_element_by_xpath('//*[@id="root"]/div/div/div[2]/form/div[1]/div/div/span/span/span')
# print(tags.text)
engine.logger.info("tags.text:%s" % tags.text)
tags.click()
time.sleep(1)
engine.driver.find_element_by_xpath('//*[@id="rc-tree-select-list_1"]/ul/li/ul/li[3]/span[1]').click()
tags2 = engine.driver.find_element_by_xpath('//*[@id="rc-tree-select-list_1"]/ul/li/ul/li[3]/ul/li[3]/span[2]/span')
# print(tags2.text)
engine.logger.info("tags2.text:%s" % tags2.text)
tags2.click()
time.sleep(1)
engine.driver.find_element_by_xpath('//*[@id="username"]').send_keys(username)
engine.driver.find_element_by_xpath('//*[@id="password"]').send_keys(password)
engine.driver.find_element_by_xpath('//*[@id="root"]/div/div/div[2]/form/div[4]/div/div/span/button').click()
time.sleep(2)
# engine.driver.quit()
@pytest.mark.login
@get_engine(__file__, 'LOGIN')
def test_login_pwerr(engine):
username = engine.get_userInfo('username')
password = engine.get_userInfo('password')
url = engine.get_testUrl('URL')
# print(username, password, url)
engine.logger.info("username: %s" % username)
engine.logger.info("password :%s" % password)
engine.logger.info("Open url: %s" % url)
# driver = engine.driver
tags = engine.driver.find_element_by_xpath('//*[@id="root"]/div/div/div[2]/form/div[1]/div/div/span/span/span')
# print(tags.text)
engine.logger.info("tags.text:%s" % tags.text)
tags.click()
time.sleep(1)
engine.driver.find_element_by_xpath('//*[@id="rc-tree-select-list_1"]/ul/li/ul/li[3]/span[1]').click()
tags2 = engine.driver.find_element_by_xpath('//*[@id="rc-tree-select-list_1"]/ul/li/ul/li[3]/ul/li[3]/span[2]/span')
# print(tags2.text)
engine.logger.info("tags2.text:%s" % tags2.text)
tags2.click()
time.sleep(1)
# 不输入密码
time1 = time.time()
form_explain_list = engine.driver.xpath('//div[@class="ant-row ant-form-item ant-form-item-with-help"]//div[@class="ant-form-explain"]')
alert_message_list = engine.driver.xpath('//div[@class="main___2iu6s"]//span[@class="ant-alert-message"]')
assert form_explain_list ==[]
assert alert_message_list ==[]
engine.load_image()
engine.driver.xpath('//*[@id="username"]')[0].send_keys(username)
# engine.driver.find_element_by_xpath('//*[@id="password"]').send_keys('123')
engine.driver.xpath('//*[@id="root"]/div/div/div[2]/form/div[4]/div/div/span/button')[0].click()
form_explain = engine.driver.xpath('//div[@class="ant-form-explain"]')[0].text
assert form_explain.strip() == '请输入密码!'
engine.logger.info('test_login_password_err:' + '不输入密码,返回正确的错误信息,text:' + form_explain)
# 输入错误的密码
engine.driver.find_element_by_xpath('//*[@id="password"]').send_keys('test_gt_pw')
engine.driver.find_element_by_xpath('//*[@id="root"]/div/div/div[2]/form/div[4]/div/div/span/button').click()
alert_message = engine.driver.xpath('//div[@class="main___2iu6s"]//span[@class="ant-alert-message"]')[0].text
assert alert_message.strip() == '账户或密码错误'
engine.logger.info('test_login_password_err:' + '输入错误密码,返回正确的错误信息,text:' + alert_message)
@pytest.mark.login
@get_engine(__file__, 'LOGIN')
def test_login_usererr(engine):
username = engine.get_userInfo('username')
password = engine.get_userInfo('password')
url = engine.get_testUrl('URL')
# print(username, password, url)
engine.logger.info("username: %s" % username)
engine.logger.info("password :%s" % password)
engine.logger.info("Open url: %s" % url)
# driver = engine.driver
tags = engine.driver.find_element_by_xpath('//*[@id="root"]/div/div/div[2]/form/div[1]/div/div/span/span/span')
# print(tags.text)
engine.logger.info("tags.text:%s" % tags.text)
tags.click()
time.sleep(1)
engine.driver.find_element_by_xpath('//*[@id="rc-tree-select-list_1"]/ul/li/ul/li[3]/span[1]').click()
tags2 = engine.driver.find_element_by_xpath('//*[@id="rc-tree-select-list_1"]/ul/li/ul/li[3]/ul/li[3]/span[2]/span')
# print(tags2.text)
engine.logger.info("tags2.text:%s" % tags2.text)
tags2.click()
time.sleep(1)
# 不输入密码
assert engine.driver.xpath('//div[@class="ant-form-explain"]') == []
assert engine.driver.xpath('//div[@class="main___2iu6s"]//span[@class="ant-alert-message"]') == []
# engine.driver.find_element_by_xpath('//*[@id="username"]').send_keys(username)
engine.driver.find_element_by_xpath('//*[@id="password"]').send_keys(password)
engine.driver.find_element_by_xpath('//*[@id="root"]/div/div/div[2]/form/div[4]/div/div/span/button').click()
form_explain = engine.driver.xpath('//div[@class="ant-form-explain"]')[0].text
assert form_explain.strip() == '请输入账户名!'
engine.logger.info('test_login_password_err:' + '不输入账户,返回正确的错误信息,text:' + form_explain)
# 输入错误的密码
engine.driver.find_element_by_xpath('//*[@id="username"]').send_keys('test_gt_user')
engine.driver.find_element_by_xpath('//*[@id="root"]/div/div/div[2]/form/div[4]/div/div/span/button').click()
alert_message = engine.driver.xpath('//div[@class="main___2iu6s"]//span[@class="ant-alert-message"]')[0].text
assert alert_message.strip() == '账户或密码错误'
engine.logger.info('test_login_password_err:' + '输入错误账户,返回正确的错误信息,text:' + alert_message)
# if __name__ == '__main__':
# pytest.main(["-m=login", "--html=report.html"])
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment