import allure
import pytest
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait

from common.excel_read import load_excel
from page.loginPage import LoginPage
from selenium.webdriver.support import expected_conditions as ec

@allure.epic("读书屋项目")
class TestCase:
    # @pytest.mark.skip
    @allure.feature('登陆功能')
    @allure.story("这是登陆成功功能噢")
    @allure.title("登陆成功用例")
    @pytest.mark.parametrize("username,passoword,expect", load_excel("./data/登陆账号成功.xlsx"))
    def test_login_success(self, driver, username, passoword, expect):
        allure.dynamic.title(f"登陆成功用例,用户名为{username},密码{passoword}")
        self.login_page = LoginPage(driver)
        self.login_page.login(username, passoword)
        # 断言
        sjmsg=self.login_page.get_result_true(str(username))
        assert sjmsg == expect, "登陆失败"

    @allure.feature('登陆功能')
    @allure.story("这是登陆失败功能噢")
    @allure.title("登陆-失败用例")
    @allure.testcase("用例链接地址:http://120.25.127.201:18001/")
    @allure.issue("缺陷链接地址:http://120.25.127.201:18001/.html")
    @allure.description("登陆失败,这是没问题的描述")
    @allure.severity("blocker")
    @pytest.mark.parametrize("username,passoword,expect", load_excel("./data/登陆账号失败.xlsx"))
    def test_login_fail(self, driver, username, passoword, expect):
        allure.dynamic.title(f"登陆失败用例,用户名为{username},密码{passoword}")
        self.login_page = LoginPage(driver)
        self.login_page.login(username, passoword)
        # 断言
        sjmsg=self.login_page.get_result_text()
        assert sjmsg == expect, "登陆失败"


    # 1.写法  后面断言
    # 2.写法 规范pom写法 用例里面 不要有元素定位的by.id，by.xpath  专门弄个元素的操作地方
    # 封装了一下 获得结果的方法  线性代码不好维护  (把断言进行了封装，元素定位放在了另外文件里面)


    # 登陆有问题 1
    # 没有问题 2

    # @pytest.mark.parametrize("username,passoword,expect", load_excel("../data/登陆账号成功.xlsx"))
    # def test_login_success(self, driver, username, passoword, expect):
    #     self.login_page = LoginPage(driver)
    #     self.login_page.login(username, passoword)
    #     # 判定文本值是不是这个 是true 不是 false
    #     sjmsg=WebDriverWait(driver, 10).until(ec.text_to_be_present_in_element((By.CSS_SELECTOR,".mr15"),str(username)))
    #     assert sjmsg == expect,"登陆失败"
    #
    #
    # # 文本内容  在实际工作中 写法不是这样写 逻辑  用例里面不加元素定位
    # @pytest.mark.skip
    # @pytest.mark.parametrize("username,passoword,expect", load_excel("../data/登陆账号失败.xlsx"))
    # def test_login_fail(self, driver, username, passoword, expect):
    #     self.login_page = LoginPage(driver)
    #     self.login_page.login(username, passoword)
    #     # ec.visibility_of_element_located((By.XPATH,'//*[@id="LabErr"]') 找到元素 返回元素
    #     sjmsg=WebDriverWait(driver,10).until(ec.visibility_of_element_located((By.XPATH,'//*[@id="LabErr"]'))).text
    #     assert sjmsg == expect, "登陆失败"




    # 获得文本内容 .text方式  测试登陆
    # [(15574113900, 123456, True), (15574113901, 123457, False), (15574113902, 123458, False)]
    # @pytest.mark.parametrize("username,passoword,expect", load_excel("../data/登陆账号.xlsx"))
    # def test_login(self, driver, username, passoword,expect):
    #     self.login_page = LoginPage(driver)
    #     sjmsg = self.login_page.login(username, passoword)
    #     assert sjmsg == expect, "登陆失败"

    # 账号失败  报错 是因为找不到元素  没有登陆  没有这个元素  找不到 超时
    # 账号密码成功 登陆成功  pass 用例通过  没有1  有2

    # 解决断言问题  登陆成功 判定文本值存在不存在
    # 登陆失败  账号错误：手机号或密码错误！ 密码错误： 手机号或密码错误！  账号格式问题：手机号格式不正确！
    # 登陆不成功：判定文本值是不是我想要的内容

    # 登陆断言位置不一样
    # 用例是不是也不能 正确的用例和错误用例放在一起写
    # 分开写
    # 登陆成功的用例  登陆成功断言
    # 登陆失败的用例  登陆失败的断言

    # 有些项目  登陆成功 文本框提示登陆成功  登陆失败 文本框提示登陆失败
    # 只要写一个用例




    #  登陆  测试的是登陆 结果判断     登陆---新增文章
    # login--createChapt
    # login页  返回是做断言的
    # createChapt 封装管理页

    # login() createChapt()

    # 流程代码 文本断言 下节课来  这节课代码敲一下 理解一下
    # 有问题 2  没问题 1

    # @pytest.mark.parametrize("username,passoword",[("15574113907","123456"),("15574111907","123456")])
    # def test_login(self,driver,username,passoword):
    #     self.login_page=LoginPage(driver)
    #     sjmsg=self.login_page.login(username,passoword)
    #     assert sjmsg==True,"登陆失败"

    # def test_login(self,driver):
    #     self.login_page=LoginPage(driver)
    #     sjmsg=self.login_page.login("15574113907","123456")
    #     assert sjmsg==True,"登陆失败"

if __name__ == '__main__':
    pytest.main(['-sv',"login_test.py"])

# 看到这个控制台就是有问题的  改成unittest规则
# 只测试了一条数据 有问题 测试登陆 不仅仅只测试一种  多个用例 上节课 param
# 参数化这样写数据 不好  把用例数据 可以写外部文件里面 yaml，excel,json，csv都可以
# excel建议从外部创建  在放进来

# 1.有了excel文件之后
# 2.从excel拿到文件数据，数据得要是列表形式的，给到的@pytest.mark.parametrize
# 3.@pytest.mark.parametrize('变量',[(),{}])