# -*- coding:utf-8 -*-
# @Time : 2019-10-25
# @Author : carl_dj

from public.common.log import Logger
from config import globalparam
from selenium.common.exceptions import NoSuchElementException
import os
import time

logger = Logger(logger='BasePage').getlog()
class BasePage:
"""测试基类"""

def __init__(self, driver):
self.driver = driver

@staticmethod
def isdisplayed(element):
"""元素是否存在"""
value = element.is_displayed()
return value

@staticmethod
def sleep(secondes):
"""强制等待"""
time.sleep(secondes)
logger.info('Sleep for %d seconds' % secondes)

def open_url(self,url):
self.driver.get(url)

def forward(self):
"""浏览器前进"""
self.driver.forward()
logger.info("Click forward on current page.")

def back(self):
"""浏览器后退"""
self.driver.back()
logger.info("Click back on current page.")

def wait(self,seconds):
"""隐式等待"""
self.driver.implicitly_wait(seconds)
logger.info("wait for %d seconds." % seconds)

def close(self):
"""关闭当前窗口"""
try:
self.driver.close()
logger.info("Closing and quit the browser.")
except NameError as e:
logger.info("Faile to quit the browser with %s" %e)

def get_img(self):
"""截图"""
rq = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
screen_name = os.path.join(globalparam.test_img_path,'%s.png' % rq)
# noinspection PyBroadException

try:
self.driver.get_screenshot_as_file(screen_name)
logger.info("Had take screenshot and save to folder : /screenshots")

except NameError as e:
logger.error("Failed to take screenshot! %s" % e)
self.get_img()

def find_element(self, selector):
"""定位元素"""
by = selector[0]
value = selector[1]
element = None
if by in ['id', 'name', 'class', 'tag', 'link', 'plink', 'css', 'xpath']:
# 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)
else:
logger.error('Not find the element')
logger.info("Had find the element! ,by %s via value :%s " %(by,value))
# logger.info('元素定位成功。定位方式:%s,使用的值%s:' % (by, value))

return element
except NoSuchElementException as e:
logger.error("NoSuchElementException %s " %e)
self.get_img() # 调用截图
else:
logger.error('Please enter a valid type of targeting elements')

def type(self, selector, value):
"""输入内容"""
element = self.find_element(selector)
# element.clear()
logger.info('clear input_box')
# noinspection PyBroadException
try:
element.send_keys(value)
logger.info('input is:%s' % value)
except BaseException:
logger.error('Failed to type in input box', exc_info=1)
self.get_img()

#输入并确认
def type_enter(self,selector,value):
try:
element = self.find_element(selector)
element.send_keys(value)
time.sleep(1)
element.send_keys(Keys.ENTER)
except Exception as e:
logger.info("Failed to type_and_enter with %s" % e)
self.get_img()
raise

def click(self, selector):
"""点击元素"""
element = self.find_element(selector)
# noinspection PyBroadException
try:
element.click()
logger.info('"The element \' %s \' was clicked." % element.text')
except BaseException:
display = self.isdisplayed(element)
if display is True:
self.sleep(3)
element.click()
logger.info('The element was clicked')
else:
self.get_img()
logger.error('Failed to click the element', exc_info=1)

def right_click(self,selector):
"""右击元素"""
element = self.find_element(selector)
try:
ActionChains(self.driver).context_click(element).perform()
logger.info("The element \' %s \' was clicked." % element.text)
except NameError as e:
logger.error("Failed to right_click the element with %s" % e)
self.get_img()

def double_click(self,selector):
"""双击"""
element = self.find_element(selector)
try:
ActionChains(self.driver).double_click(element).perform()
except Exception as e:
logger.info("Failed to double_click the element with %s" % e)
self.get_img()
raise

def move_to_element(self,selector):
"""鼠标移到元素上"""
try:
element = self.find_element(selector)
ActionChains(self.driver).move_to_element(element).perform()
except Exception as e:
logger.info("Failed to move_to_element the element with %s" % e)
self.get_img()
raise

def drag_and_drop(self, element_selector,ta_selector):
"""拖拽"""
try:
element_drag = self.find_element(element_selector)
taget_drop = self.find_element(ta_selector)
ActionChains(self.driver).drag_and_drop(element_drag,taget_drop).perform()
except Exception as e:
logger.info("Failed to drag_and_drop the element with %s" % e)
self.get_img()
raise

def refresh(self):
"""刷新"""
self.driver.refresh()

def submit(self,selector):
"""submit"""
try:
element = self.find_element(selector)
element.submit()
except Exception as e:
logger.info("Failed to submit the element with %s" % e)
self.get_img()

def get_attribute(self,selector,attribute):
"""获取元素属性"""
try:
element = self.find_element(selector)
return element.get_attribute(attribute)
except Exception as e:
logger.info("Failed to get_attribute with %s" % e)
self.get_img()
raise

def get_text(self,selector):
"""获取元素的文本信息"""
try:
return self.find_element(selector).text
except Exception as e:
logger.info("Failed to get_text with %s" % e)
self.get_img()

def dismiss_alert(self):
"""弹窗 alert——取消"""
self.driver.switch_to.alert.dismiss()


def clear(self,selector):
"""清除文本框"""
element = self.find_element(selector)
try:
element.clear()
logger.info("Clear text in input box before typing.")

except NameError as e:
logger.error("Failed to clear in input box with %s" % e)
self.get_img()

def use_js(self, js):
"""调用js"""
# noinspection PyBroadException
try:
self.driver.execute_script(js)
logger.info('successful,js contents is:%s' % js)
except BaseException:
logger.error('js error', exc_info=1)

def switch_menue(self, parentelement, secelement, targetelement):
"""三级菜单切换"""
self.sleep(3)
# noinspection PyBroadException
try:
self.driver.switch_to_default_content()
self.click(parentelement)
logger.info('成功点击一级菜单:%s' % parentelement)
self.click(secelement)
logger.info('成功点击二级菜单:%s' % secelement)
self.click(targetelement)
logger.info('成功点击三级菜单:%s' % targetelement)
except BaseException:
logger.error('切换菜单报错', exc_info=1)


def switch_ifarme(self, selector):
"""切换ifarme"""
element = self.find_element(selector)
# noinspection PyBroadException
try:
self.driver.switch_to.frame(element)
logger.info('Successful to switch_to_frame! ')
except BaseException:
logger.error('Failed to switch_to_frame', exc_info=1)

def quit_iframe(self):
"""退出当前iframe"""
self.driver.switch_to_default_content()

def get_title(self):
"""获取title"""
title = self.driver.title
logger.info('Current page title is:%s' % title)
return title

def quit(self):
"""关闭浏览器"""
self.driver.quit()
logger.info('quit the browser')