示例#1
0
 def do_func(*arg):
     n = Settings().n
     i = 0
     now = datetime.datetime.now()
     log(
         log_path,
         "A\t开始时间:{}\t{}".format(now.strftime('%Y-%m-%d %H:%M:%S'),
                                 func.__name__))
     while True:
         log(
             log_path,
             "C\t{}{} 方法第{}次开始执行~~~".format("  ☆  ", func.__name__,
                                            i + 1))
         try:
             func(*arg)
             break
         except AssertionError as e:
             log(
                 log_path, "E\t{}{} 执行过程中出现了断言异常,具体信息为:\n\t{}".format(
                     "  ☆  ", func.__name__, str(e)))
             i += 1
         except:
             log(
                 log_path, "F\t{}{} 执行过程中出现了其他异常,具体信息为:\n\t{}".format(
                     "  ☆  ", func.__name__, traceback.format_exc()))
             i += 1
         if i == n:
             break
         # lg.log("出现非断言异常,即将进行一次重试!速度将会根据配置文件放慢执行!!!!")
     log(log_path, "D\t{}{} 方法执行结束~~~".format("  ☆  ", func.__name__))
     now = datetime.datetime.now()
     log(
         log_path,
         "B\t结束时间:{}\t{}\n".format(now.strftime('%Y-%m-%d %H:%M:%S'),
                                   func.__name__))
示例#2
0
class Test_NAME(unittest.TestCase):
    def setUp(self):
        self.he = Home_element()
        self.le = Log_in_element()
        self.st = Settings()
        self.sc = Shopping_cart_element()
        self.so = Submit_order_element()
        self.bs = Backstage()
        self.uc = User_center_element()
        self.driver = SeleniumDriver(type=None)
        self.driver.Wait()
        self.base_url = self.st.base_url

    @log_decorator(Settings().log)
    def test_NAME(self):
        # 调用函数
        he = self.he
        le = self.le
        st = self.st
        sc = self.sc
        so = self.so
        bs = self.bs
        uc = self.uc
        # 打开网页
        driver = self.driver
        driver.open(self.base_url)
        # 执行测试内容
        pass

    def tearDown(self):
        self.driver.quit()
示例#3
0
class Log_in_element():

    he = Home_element()
    st = Settings()
    '''
        登录界面元素
    '''
    LOG_IN_USERNAME = [By.NAME, "username"]
    LOG_IN_USERPASSWD = [By.NAME, "password"]
    LOG_IN_IMTY_BUTTON = [By.NAME, "submit"]

    def log_in(self, driver, user):
        '''
            前段登录
        '''
        # 实例化首页元素
        he = self.he
        # 打开前段
        driver.open(self.st.base_url)
        # 点击登录 //*[@id='ECS_MEMBERZONE']/a[1]/img
        try:
            driver.find_element(he.LOG_IN_BUTTON).click()
        except:
            he.quit(driver)
            sleep(1)
            driver.find_element(he.LOG_IN_BUTTON).click()
            print("|---------------------------------------|")
            print("|    这是一个登录安全漏洞!大BUG!!!!!    |")
            print("|---------------------------------------|")
        # 输入用户名 name="username"
        driver.find_element(self.LOG_IN_USERNAME).send_keys(user['name'])
        # 输入密码 name="password"
        driver.find_element(self.LOG_IN_USERPASSWD).send_keys(user['password'])
        # 点击立即登录 name="submit"
        driver.find_element(self.LOG_IN_IMTY_BUTTON).click()
示例#4
0
 def setUp(self):
     self.he = Home_element()
     self.le = Log_in_element()
     self.st = Settings()
     self.sc = Shopping_cart_element()
     self.so = Submit_order_element()
     self.bs = Backstage()
     self.uc = User_center_element()
     self.driver = SeleniumDriver(type=None)
     self.driver.Wait()
     self.base_url = self.st.base_url
示例#5
0
 def __init__(self, type=None):
     '''
         初始化指定的浏览器驱动
     '''
     # 得到webdriver
     self.driver = Chrome_flash()
     # self.driver = WebDriver(command_executor='http://172.31.23.143:4444/wd/hub',
     #                         desired_capabilities=DesiredCapabilities.CHROME)
     # 实例化基本配置
     st = Settings()
     # 获取放慢速度
     if type is None:
         self.speed = st.speed_default
     else:
         self.speed = st.speed_down
     log(self.log_path, "G\t初始化指定的浏览器驱动~~~")
示例#6
0
class Test_Log(unittest.TestCase):
    def setUp(self):
        self.st = Settings()
        self.driver = SeleniumDriver(type=None)
        self.driver.Wait()
        self.base_url = "http://baidu.com"

    @log_decorator(Settings().log)
    def test_log(self):
        # 调用函数
        st = self.st
        # 打开网页
        driver = self.driver
        driver.open(self.base_url)

    def tearDown(self):
        self.driver.quit()
示例#7
0
 def setUp(self):
     self.st = Settings()
     self.driver = SeleniumDriver(type=None)
     self.driver.Wait()
     self.base_url = "http://baidu.com"
示例#8
0
class Submit_order_element():
    '''
        提交订单页面
    '''

    uc = User_center_element()
    st = Settings()

    SUBMIT_ORDER_BUTTON = [By.XPATH, "//input[@type='image']"]
    DELIVERY_METHOD_LIST = [By.XPATH, "//table[@id='shippingTable']/tbody/tr"]
    DELIVERY_METHOD = [By.NAME, "shipping"]
    PAY_METHOD_LIST = [By.XPATH, "//table[@id='paymentTable']/tbody/tr"]
    PAY_METHOD = [By.NAME, "payment"]
    ORDER_NUMBER = [By.XPATH, "//font[@style='color:red']"]

    def submit_order_button(self, driver, method=None, pay=None):
        '''
                尝试去点击配送方式
                如果没有 则填写地址
        '''

        uc = self.uc
        st = self.st
        # 尝试是否需要添加地址
        try:
            # 输入地址
            uc.add_shipping_address(driver)
        except:
            pass
        # 点击配送方式
        self.delivery_method(driver, method)
        # 点击付款方式
        self.pay_method(driver, pay)
        # 尝试找到 提交订单 input type="image"
        driver.find_element(self.SUBMIT_ORDER_BUTTON).click()
        # 导出订单号 font style="color:red"
        order_number = driver.find_element(self.ORDER_NUMBER).text
        print("订单号:{}".format(order_number))
        return order_number

    def delivery_method(self, driver, method='城际快递'):
        # id="shippingTable"    /tbody/tr
        method_list = driver.find_elements(self.DELIVERY_METHOD_LIST)
        method_number = 0
        if method == '城际快递':
            method_number = 1
        elif method == '申通快递':
            method_number = 2
        elif method == '邮局平邮':
            method_number = 3
        elif method == '随机' or method == None:
            method_number = 0
        else:
            print("请输入正确配送方式:城际快递、申通快递、邮局平邮")
        # 选择
        if method_number != 0:
            method_list[method_number].find_element(
                *self.DELIVERY_METHOD).click()
        else:
            n = randint(1, 3)
            method_list[n].find_element(*self.DELIVERY_METHOD).click()

    def pay_method(self, driver, pay='余额支付'):
        # paymentTable
        # id="shippingTable"    /tbody/tr
        method_list = driver.find_elements(self.PAY_METHOD_LIST)
        method_number = 0
        if pay == '余额支付':
            method_number = 1
        elif pay == '货到付款':
            method_number = 3
        elif pay == '随机' or pay == None:
            method_number = 0
        else:
            print("请输入正确配送方式:余额支付、货到付款")
        # 选择
        if method_number != 0:
            method_list[method_number].find_element(*self.PAY_METHOD).click()
        else:
            a = [1, 3]
            n = random.sample(a, 1)
            n = n[0]
            method_list[n].find_element(*self.PAY_METHOD).click()
示例#9
0
class Backstage():

    st = Settings()

    # 后台界面切换
    FRAME_MAIN = "main-frame"
    FRAME_ABOVE = "header-frame"
    FRAME_MENU = "menu-frame"

    BACKSTAGE_ADMIN_NAME = [By.NAME, "username"]
    BACKSTAGE_ADMIN_PASSWORD = [By.NAME, "password"]
    BACKSTAGE_ADMIN_BUTTON = [By.CLASS_NAME, "button"]
    PENDING_ORDER = [By.LINK_TEXT, "待发货订单:"]
    BACKSTAGE_VIEW_ORDER = [By.LINK_TEXT, "查看"]
    GENERATE_A_SHIPPING_ORDER = [By.NAME, "ship"]
    CONFIRM_GENERATE_INVOICE = [By.NAME, "delivery_confirmed"]
    ORDER_SEARCH = [By.NAME, "order_sn"]
    SELECT_ORDER_STATUS = [By.NAME, 'status']
    BACKSTAGE_SEARCH = [By.XPATH, "//input[@value=' 搜索 ']"]
    BACKSTAGE_GO_SHIP = [By.NAME, "to_delivery"]
    BACKSTAGE_SHIP = [By.NAME, "delivery_confirmed"]
    SUCCESSFUL_OPERATION = [
        By.XPATH, "/html/body/div[1]/div/table/tbody/tr[1]/td[2]"
    ]
    SHIPPED = [By.XPATH, "//div[@id='listDiv']/table[1]/tbody/tr[3]/td[7]"]
    UNREVIEWED_COMMENT = [By.LINK_TEXT, "未审核评论:"]
    COMMENT_SEARCH = [By.NAME, "keyword"]
    SEE_DETAILS = [By.LINK_TEXT, "查看详情"]
    BY_COMMENT_BUTTON = [By.CSS_SELECTOR, "input.button"]
    ENTER_A_COMMENT = [By.NAME, "content"]
    REPLY_TO_COMMENT_CONFIRMATION = [By.NAME, "submit"]

    def log_in_backstage(self, driver):
        try:
            driver.open(self.st.admin_url)
            # 输入用户名 name="username"
            driver.find_element(self.BACKSTAGE_ADMIN_NAME).send_keys(
                self.st.Admin['name'])
            # 输入密码 name="password"
            driver.find_element(self.BACKSTAGE_ADMIN_PASSWORD).send_keys(
                self.st.Admin['password'])
            # 点击进入管理中心 class="button"
            driver.find_element(self.BACKSTAGE_ADMIN_BUTTON).click()
        except:
            print("|---------------------------------------|")
            print("|    这是一个登录安全漏洞!大BUG!!!!!    |")
            print("|---------------------------------------|")

    def generate_a_shipping_order(self, driver, order_number):
        '''
            后台 生成发货订单
        '''
        self.frame_main(driver)
        # 点击 a标签 待发货订单:
        driver.find_element(self.PENDING_ORDER).click()
        # 搜索 name="order_sn" 输入 order_number
        self.order_search(driver, order_number)
        # 点击查看 a 查看
        driver.find_element(self.BACKSTAGE_VIEW_ORDER).click()
        try:
            # 点击 生成发货订单 name="ship"
            driver.find_element(self.GENERATE_A_SHIPPING_ORDER).click()
            # 点击 确认生成发货单 name="delivery_confirmed"
            driver.find_element(self.CONFIRM_GENERATE_INVOICE).click()
            sleep(2)
            # 断言 操作成功
            try:
                text = driver.find_element(self.SUCCESSFUL_OPERATION).text
                TestCase.assertEqual(TestCase(), "操作成功", text, "确认生成发货单 断言失败!")
            except:
                print("确认生成发货单 未找到成功信息~~~~~")
        except:
            print("已完成 确认生成发货单 跳过确认生成发货单")

    def order_search(self, driver, order_number):
        # 搜索 name="order_sn" 输入 order_number
        driver.find_element(self.ORDER_SEARCH).send_keys(order_number)
        # 搜索 订单状态 select name="status"
        select_order_status = driver.find_element(self.SELECT_ORDER_STATUS)
        order_status = Select(select_order_status)
        order_status.select_by_visible_text("请选择...")
        # 点击 搜索 input value=" 搜索 "
        driver.find_element(self.BACKSTAGE_SEARCH).click()
        sleep(1)

    def ship(self, driver, order_number):
        '''
            后台 发货
        '''
        # 尝试搜索
        try:
            # 点击 去发货 name="to_delivery"
            driver.find_element(self.BACKSTAGE_GO_SHIP).click()
            # 点击 查看
            driver.find_element(self.BACKSTAGE_VIEW_ORDER).click()
            # 点击 发货 name="delivery_confirmed"
            driver.find_element(self.BACKSTAGE_SHIP).click()

        except:
            self.frame_main(driver)
            # 点击 a标签 待发货订单:
            driver.find_element(self.PENDING_ORDER).click()
            self.order_search(driver, order_number)
        # 断言 操作成功
        try:
            text = driver.find_element(self.SUCCESSFUL_OPERATION).text
            TestCase.assertEqual(TestCase(), "操作成功", text, "发货操作 断言失败!")
        except:
            print("发货操作 未找到成功信息~~~~~")
        # 再断言 name="order_sn"
        self.order_search(driver, order_number)
        try:
            # //div[@id="listDiv"]/table[1]/tbody/tr[3]/td[7]
            text = driver.find_element(self.SHIPPED)
            TestCase.assertEqual(TestCase(), "已发货", text, "发货单列表 断言失败!")
        except:
            print("发货单列表 未找到成功信息~~~~~")

    def review_comments(self, driver, comment_user, comment_admin=None):
        '''
        :说明:
        :   审核评论,如果没有通过,则评论+通过;
        :   如果通过了,则禁止显示
        :return: 管理员评论 or 订单状态
        :   comment_admin_str
        :   comment_status
        '''
        # 切换子界面
        self.frame_main(driver)
        # 点击 未评审
        driver.find_element(self.UNREVIEWED_COMMENT).click()
        # 按评论搜索
        driver.find_element(self.COMMENT_SEARCH).send_keys(comment_user)
        # 点击确认
        driver.find_element(self.BACKSTAGE_SEARCH).click()
        sleep(1)
        # 点击 查看详情
        driver.find_element(self.SEE_DETAILS).click()
        # 点击 允许显示
        comment_status = driver.find_element(
            self.BY_COMMENT_BUTTON).get_attribute("value")
        user_name = driver.find_element_by_xpath(
            "/html/body/div[1]/table/tbody/tr[1]/td/a/b").text
        product_name = driver.find_element_by_xpath(
            "/html/body/div[1]/table/tbody/tr[1]/td/b").text
        driver.find_element(self.BY_COMMENT_BUTTON).click()
        # 切回界面
        self.quit_frame(driver)
        # 切换子界面
        self.frame_main(driver)
        # 输入评论
        if comment_admin:
            comment_admin_str = comment_admin
        else:
            comment_admin_str = str(time())
        driver.find_element(self.ENTER_A_COMMENT).send_keys(comment_admin_str)
        # 点击 确认
        driver.find_element(self.REPLY_TO_COMMENT_CONFIRMATION).click()
        if comment_status == "禁止显示":
            print("已禁止显示 {}的评论:{}".format(user_name, comment_user))
        return product_name, user_name, comment_status, comment_admin_str

    def frame_main(self, driver):
        driver.switch_to_frame(self.FRAME_MAIN)

    def frame_above(self, driver):
        driver.switch_to_frame(self.FRAME_ABOVE)

    def frame_menu(self, driver):
        driver.switch_to_frame(self.FRAME_MENU)

    def quit_frame(self, driver):
        driver.switch_to_default_content()

    def return_purchase(self, driver, order_number, comment=None):
        self.find_order(driver, order_number)
        # 点击退货 name = order_number
        return_purchase = driver.find_element_by_name("return")
        text = return_purchase.get_attribute("value")
        if text == "退货":
            return_purchase.click()
        else:
            print("订单{}:目前状态为:订单未完成,不能退货".format(order_number))
        self.quit_frame(driver)
        self.frame_main(driver)
        if comment:
            comment_str = str(comment)
        else:
            comment_str = str(time())
        # name="action_note"
        driver.find_element_by_name("action_note").send_keys(comment_str)
        driver.find_element_by_name("submit").click()
        # /html/body/div[1]/div/table/tbody/tr[1]/td[2]
        prompt = driver.find_element(self.SUCCESSFUL_OPERATION).text
        TestCase.assertEqual(TestCase(), "操作成功", prompt, "退货操作断言失败!")

    def find_order(self, driver, order_number):
        self.frame_main(driver)
        # 点击 a标签 待发货订单:
        driver.find_element(self.PENDING_ORDER).click()
        # 搜索 name="order_sn" 输入 order_number
        self.order_search(driver, order_number)
        # 点击查看 a 查看
        driver.find_element(self.BACKSTAGE_VIEW_ORDER).click()
示例#10
0
class SeleniumDriver(object):

    log_path = Settings().log

    def __init__(self, type=None):
        '''
            初始化指定的浏览器驱动
        '''
        # 得到webdriver
        self.driver = Chrome_flash()
        # self.driver = WebDriver(command_executor='http://172.31.23.143:4444/wd/hub',
        #                         desired_capabilities=DesiredCapabilities.CHROME)
        # 实例化基本配置
        st = Settings()
        # 获取放慢速度
        if type is None:
            self.speed = st.speed_default
        else:
            self.speed = st.speed_down
        log(self.log_path, "G\t初始化指定的浏览器驱动~~~")

    # 初始化等待
    def Wait(self):
        driver = self.driver
        # 设置元素识别超时时间
        driver.implicitly_wait(15)
        # 设置页面加载超时时间
        driver.set_page_load_timeout(15)
        # 设置异步脚本加载超时时间
        driver.set_script_timeout(15)
        log(self.log_path, "G\t加载初始化等等~~~")

    def open(self, base_url):
        # 调用webdriver真正相应的方法
        self.driver.get(base_url)
        # 加个等待时间
        sleep(self.speed)
        log(self.log_path, "G\t打开网页:{}~~~".format(base_url))

    def quit(self):
        # 调用webdriver真正相应的方法
        self.driver.quit()
        log(self.log_path, "G\t退出当前网页网页~~~")

    def find_element_by_id(self, ID):
        # 调用webdriver真正相应的方法
        # 加个等待时间
        sleep(self.speed)
        log(self.log_path, "G\t正在定位 ID = {}".format(ID))
        # 返回找到的元素对象
        return self.driver.find_element_by_id(ID)

    def find_element_by_name(self, name):
        # 调用webdriver真正相应的方法
        # 加个等待时间
        sleep(self.speed)
        log(self.log_path, "G\t正在定位 NAME = {}".format(name))
        # 返回找到的元素对象
        return self.driver.find_element_by_name(name)

    def find_element_by_class_name(self, class_name):
        # 调用webdriver真正相应的方法
        # 加个等待时间
        sleep(self.speed)
        log(self.log_path, "G\t正在定位 CLASS_NAME = {}".format(class_name))
        # 返回找到的元素对象
        return self.driver.find_element_by_class_name(class_name)

    def find_element_by_tag_name(self, tag_name):
        # 调用webdriver真正相应的方法
        # 加个等待时间
        sleep(self.speed)
        log(self.log_path, "G\t正在定位 TAG_NAME = {}".format(tag_name))
        # 返回找到的元素对象
        return self.driver.find_element_by_tag_name(tag_name)

    def find_element_by_link_text(self, link_text):
        # 调用webdriver真正相应的方法
        # 加个等待时间
        sleep(self.speed)
        log(self.log_path, "G\t正在定位 LINK_NAME = {}".format(link_text))
        # 返回找到的元素对象
        return self.driver.find_element_by_link_text(link_text)

    def find_element_by_partial_link_text(self, partial_link_text):
        # 调用webdriver真正相应的方法
        # 加个等待时间
        sleep(self.speed)
        log(self.log_path, "G\t正在定位 PARTIAL_LINK_NAME = {}".format(partial_link_text))
        # 返回找到的元素对象
        return self.driver.find_element_by_partial_link_text(partial_link_text)

    def find_element_by_xpath(self, xpath):
        # 调用webdriver真正相应的方法
        # 加个等待时间
        sleep(self.speed)
        log(self.log_path, "G\t正在定位 XPATH = {}".format(xpath))
        # 返回找到的元素对象
        return self.driver.find_element_by_xpath(xpath)

    def find_element_by_css_selector(self, css_selector):
        # 调用webdriver真正相应的方法
        # 加个等待时间
        sleep(self.speed)
        log(self.log_path, "G\t正在定位 CSS_SELECTOR = {}".format(css_selector))
        # 返回找到的元素对象
        return self.driver.find_element_by_css_selector(css_selector)

    def find_element(self, By):
        # 调用webdriver真正相应的方法
        # 加个等待时间
        sleep(self.speed)
        log(self.log_path, "G\t正在定位 {} = {}".format(*By))
        # 返回找到的元素对象
        return self.driver.find_element(*By)

    '''
        列表
    '''

    def find_elements_by_id(self, ID):
        # 调用webdriver真正相应的方法
        # 加个等待时间
        sleep(self.speed)
        log(self.log_path, "G\t正在列表定位 ID = {}".format(ID))
        # 返回找到的元素对象
        return self.driver.find_elements_by_id(ID)

    def find_elements_by_name(self, name):
        # 调用webdriver真正相应的方法
        # 加个等待时间
        sleep(self.speed)
        log(self.log_path, "G\t正在列表定位 NAME = {}".format(name))
        # 返回找到的元素对象
        return self.driver.find_elements_by_name(name)

    def find_elements_by_class_name(self, class_name):
        # 调用webdriver真正相应的方法
        # 加个等待时间
        sleep(self.speed)
        log(self.log_path, "G\t正在列表定位 CLASS_NAME = {}".format(class_name))
        # 返回找到的元素对象
        return self.driver.find_elements_by_class_name(class_name)

    def find_elements_by_tag_name(self, tag_name):
        # 调用webdriver真正相应的方法
        # 加个等待时间
        sleep(self.speed)
        log(self.log_path, "G\t正在列表定位 TAG_NAME = {}".format(tag_name))
        # 返回找到的元素对象
        return self.driver.find_elements_by_tag_name(tag_name)

    def find_elements_by_link_text(self, link_text):
        # 调用webdriver真正相应的方法
        # 加个等待时间
        sleep(self.speed)
        log(self.log_path, "G\t正在列表定位 LINK_NAME = {}".format(link_text))
        # 返回找到的元素对象
        return self.driver.find_elements_by_link_text(link_text)

    def find_elements_by_partial_link_text(self, partial_link_text):
        # 调用webdriver真正相应的方法
        # 加个等待时间
        sleep(self.speed)
        log(self.log_path, "G\t正在列表定位 PARTIAL_LINK_NAME = {}".format(partial_link_text))
        # 返回找到的元素对象
        return self.driver.find_elements_by_partial_link_text(partial_link_text)

    def find_elements_by_xpath(self, xpath):
        # 调用webdriver真正相应的方法
        # 加个等待时间
        sleep(self.speed)
        log(self.log_path, "G\t正在列表定位 XPATH = {}".format(xpath))
        # 返回找到的元素对象
        return self.driver.find_elements_by_xpath(xpath)

    def find_elements_by_css_selector(self, css_selector):
        # 调用webdriver真正相应的方法
        # 加个等待时间
        sleep(self.speed)
        log(self.log_path, "G\t正在列表定位 CSS_SELECTOR = {}".format(css_selector))
        # 返回找到的元素对象
        return self.driver.find_elements_by_css_selector(css_selector)

    def find_elements(self, By):
        # 调用webdriver真正相应的方法
        # 加个等待时间
        sleep(self.speed)
        log(self.log_path, "G\t正在列表定位 {} = {}".format(*By))
        # 返回找到的元素对象
        return self.driver.find_elements(*By)

    def switch_to_frame(self, frame):
        # 调用webdriver真正相应的方法
        # 加个等待时间
        sleep(self.speed)
        log(self.log_path, "G\t切换内置窗口至 {}".format(frame))
        # 返回找到的元素对象
        return self.driver.switch_to.frame(frame)

    def switch_to_default_content(self):
        # 调用webdriver真正相应的方法
        # 加个等待时间
        sleep(self.speed)
        log(self.log_path, "G\t切会主窗口")
        # 返回找到的元素对象
        return self.driver.switch_to.default_content()

    def switch_to_alert(self):
        # 调用webdriver真正相应的方法
        # 加个等待时间
        sleep(self.speed)
        log(self.log_path, "G\t弹出窗口点击 确认")
        # 返回找到的元素对象
        return self.driver.switch_to_alert()