import allure
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec

class WebKeys:
    # 浏览器  __init__ 初始化函数  只要实例化WebKeys  就会走到init里面打开浏览器
    # webdriver.chorme 外面创建
    def __init__(self,driver):
        self.driver=driver
        self.wait=WebDriverWait(self.driver, 10)

    # 访问不同的网址  函数传参
    @allure.step("访问")
    def open(self,url):
        self.driver.get(url)

     # 我不知道给哪个元素加边框  1 不能2

    def locator_station(self, element):
        self.driver.execute_script(
            "arguments[0].setAttribute('style',arguments[1]);",
            element,
            "border: 2px solid green;"  # 边框，green绿色
        )

    # 元素定位 传两个参数  可以用显示等待定位元素
    # visibility_of_element_located 传元组 （By.id,xxx）
    # 显示等待+定位  找到元素之后 要返回出去
    # 为什么要返回出去 是因为后面要马上操作它 调用的时候 找到元素之后 才能进行点击进行输入
    # 找到元素之后有边框  加进来封装
    @allure.step("元素定位")
    def locator_with_wait(self,name,value):
        # self.driver.find_element(name,value).send_keys()
        # el=self.driver.find_element(name,value)
        # el.send_keys()
        locator=(name,value)
        el=self.wait.until(ec.visibility_of_element_located(locator))
        self.locator_station(el)
        return el

    @allure.step("多元素定位")
    def locators_with_wait(self, name, value):
        locator = (name, value)
        el = self.wait.until(ec.visibility_of_all_elements_located(locator))
        return el

    @allure.step("点击")
    def on_click(self,name,value):
        self.locator_with_wait(name, value).click()


    # 窗口切换  项目中基础操作 作家管理
    @allure.step("窗口切换")
    def change_window(self,n):
        # 获取所有的窗口  获取所有的句柄
        handles=self.driver.window_handles
        # 切换窗口  拿下标  到底拿哪个下标
        self.driver.switch_to.window(handles[n])

    # 文本断言  登陆的时候
    # locator = ("partial link text", "章节管理")
    # wait.until(ec.visibility_of_element_located(locator)).click()

    # 为什么写返回是因为我后面需要拿这个值进行断言  返回
    # 获得结果
    @allure.step("获得返回结果")
    def text_wait(self,name,value,txt):
        el=(name,value)
        result=self.wait.until(ec.text_to_be_present_in_element(el,txt))
        return result

#     获得文本内容结果
    @allure.step("获得返回文本")
    def get_text(self,name,value):
        el = (name, value)
        # result = self.wait.until(ec.visibility_of_element_located(el)).text
        result = self.wait.until(
            lambda x: x.find_element(*el).text
        )
        return result

    # lamda
#     断言文本内容

