#!/usr/bin/python3
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.select import Select
from selenium.common.exceptions import * # 导入所有的异常类
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from utils.logger import Logger
import time
class BasePage(object):
def __init__(self, driver):
"""
:param driver:打开浏览器驱动
"""
self.driver = driver
self.log = Logger()
def get_page_title(self):
self.log.info("当前页面的title为: %s" % self.driver.title)
return self.driver.title
def find_element(self, *loc):
try:
# 元素可见时,返回查找到的元素;以下入参为元组的元素,需要加*
WebDriverWait(self.driver, 30).until(lambda driver: driver.find_element(*loc).is_displayed())
return self.driver.find_element(*loc)
except NoSuchElementException:
self.log.warning('找不到定位元素: %s' % loc[1])
raise
except TimeoutException:
self.log.warning('查找元素超时: %s' % loc[1])
raise
def find_elements(self, *loc):
try:
# 元素可见时,返回查找到的元素;以下入参为元组的元素,需要加*
WebDriverWait(self.driver, 30).until(lambda driver: driver.find_elements(*loc).is_displayed())
return self.driver.find_elements(*loc)
except NoSuchElementException:
self.log.warning('找不到定位元素: %s' % loc[1])
raise
except TimeoutException:
self.log.warning('查找元素超时: %s' % loc[1])
raise
def get_screent_img(self, value):
"""将页面截图下来"""
file_path = './report/screenshot/'
image_path = self.conf.path()
now = time.strftime("%Y-%m-%d_%H_%M_%S_")
screen_name = image_path + value + '.png'
try:
self.driver.get_screenshot_as_file(screen_name)
self.log.info("页面已截图,截图的路径在项目: %s " % image_path)
except NameError as ne:
self.log.error("失败截图 %s" % ne)
self.get_screent_img(value)
def send_key(self, loc, text):
self.log.info('清空文本框内容: %s...' % loc[1])
self.find_element(*loc).clear()
time.sleep(1)
self.log.info('输入内容方式 by %s: %s...' % (loc[0], loc[1]))
self.log.info('输入内容: %s' % text)
try:
self.find_element(*loc).send_keys(text)
time.sleep(1)
except Exception as e:
self.log.error("输入内容失败 %s" % e)
self.get_screent_img(text)
def click(self, loc):
self.log.info('点击元素 by %s: %s...' % (loc[0], loc[1]))
try:
self.find_element(*loc).click()
time.sleep(1)
except AttributeError as e:
self.log.error("无法点击元素: %s" % e)
raise
def clear(self, loc):
"""输入文本框清空操作"""
element = self.find_element(*loc)
try:
element.clear()
self.log.info('清空文本框内容')
except NameError as ne:
self.log.error("清空文本框内容失败: %s" % ne)
self.get_screent_img(ne)
def move_to_element(self, loc):
"""
鼠标悬停操作
Usage:
element = ("id","xxx")
driver.move_to_element(element)
"""
element = self.find_element(*loc)
ActionChains(self.driver).move_to_element(element).perform()
def back(self):
"""
浏览器返回窗口
"""
self.driver.back()
self.log.info('返回上一个页面')
def forward(self):
"""
浏览器前进下一个窗口
"""
self.driver.forward()
self.log.info('前进到下一个页面')
def close(self):
"""
关闭浏览器
"""
try:
self.driver.close()
self.log.info('关闭浏览器窗口')
except NameError as ne:
self.log.error("关闭浏览器窗口失败 %s" % ne)
def quit(self):
"""
退出浏览器
"""
self.driver.quit()
def get_title(self):
"""获取title"""
return self.driver.title
def get_text(self, loc):
"""获取文本"""
return self.find_element(*loc).text
def get_attribute(self, loc, name):
"""获取属性"""
element = self.find_element(*loc)
return element.get_attribute(name)
def js_execute(self, js):
"""执行js"""
return self.driver.execute_script(js)
def js_focus_element(self, loc):
"""聚焦元素"""
target = self.find_element(*loc)
self.driver.execute_script("arguments[0].scrollIntoView();", target)
def js_scroll_top(self):
"""滚动到顶部"""
js = "window.scrollTo(0,0)"
self.driver.execute_script(js)
def js_scroll_end(self):
"""滚动到底部"""
js = "window.scrollTo(0,document.body.scrollHeight)"
self.driver.execute_script(js)
def select_by_index(self, loc, index):
"""通过索引,index是索引第几个,从0开始"""
element = self.find_element(*loc)
Select(element).select_by_index(index)
def select_by_value(self, loc, value):
"""通过value属性"""
element = self.find_element(*loc)
Select(element).select_by_value(value)
def select_by_text(self, loc, text):
"""通过文本值定位"""
element = self.find_element(*loc)
Select(element).select_by_value(text)
def is_text_in_element(self, loc, text, timeout=10):
"""判断文本在元素里,没定位到元素返回False,定位到元素返回判断结果布尔值"""
try:
result = WebDriverWait(self.driver, timeout, 1).until(EC.text_to_be_present_in_element(loc, text))
except TimeoutException:
print("元素没有定位到:" + str(loc))
return False
else:
return result
def is_text_in_value(self, loc, value, timeout=10):
"""
判断元素的value值,没定位到元素返回false,定位到返回判断结果布尔值
result = driver.text_in_element(element, text)
"""
try:
result = WebDriverWait(self.driver, timeout, 1).until(
EC.text_to_be_present_in_element_value(loc, value))
except TimeoutException:
print("元素没定位到:" + str(loc))
return False
else:
return result
def is_title(self, title, timeout=10):
"""判断title完全等于"""
return WebDriverWait(self.driver, timeout, 1).until(EC.title_is(title))
def is_title_contains(self, title, timeout=10):
"""判断title包含"""
return WebDriverWait(self.driver, timeout, 1).until(EC.title_contains(title))
def is_selected(self, loc, timeout=10):
"""判断元素被选中,返回布尔值,"""
return WebDriverWait(self.driver, timeout, 1).until(EC.element_located_to_be_selected(loc))
def is_selected_be(self, loc, selected=True, timeout=10):
"""判断元素的状态,selected是期望的参数true/False
返回布尔值"""
return WebDriverWait(self.driver, timeout, 1).until(EC.element_located_selection_state_to_be(loc, selected))
def is_alert_present(self, timeout=10):
"""判断页面是否有alert,
有返回alert(注意这里是返回alert,不是True)
没有返回False"""
return WebDriverWait(self.driver, timeout, 1).until(EC.alert_is_present())
def is_visibility(self, loc, timeout=10):
"""元素可见返回本身,不可见返回Fasle"""
return WebDriverWait(self.driver, timeout, 1).until(EC.visibility_of_element_located(loc))
def is_invisibility(self, loc, timeout=10):
"""元素可见返回本身,不可见返回True,没找到元素也返回True"""
return WebDriverWait(self.driver, timeout, 1).until(EC.invisibility_of_element_located(loc))
def is_clickable(self, loc, timeout=10):
"""元素可以点击is_enabled返回本身,不可点击返回Fasle"""
return WebDriverWait(self.driver, timeout, 1).until(EC.element_to_be_clickable(loc))
def is_located(self, loc, timeout=10):
"""判断元素有没被定位到(并不意味着可见),定位到返回element,没定位到返回False"""
return WebDriverWait(self.driver, timeout, 1).until(EC.presence_of_element_located(loc))
webdriver封装
最新推荐文章于 2023-06-30 08:52:56 发布