继上篇搭建webui目录后学习
1,在common包下新建一个driver.py文件
目的是因为:每一个获取元素都需要创建一个
class GlobalDriver:
# 定义类属性 代表所有的公共driver对象
driver = None # 去哪里赋值呢 fixture
# 元素查找、点击、输入、切换窗口、frame、alert、鼠标等核心代码
class InitDriver:
def __init__(self,browser='chrome',remote_url=None):
self.logger = GetLogger().get_logger()
# self.driver = webdriver.Chrome()
if remote_url != None:
if browser.lower()=='chrome':
options=webdriver.ChromeOptions()
elif browser.lower()=='firefox':
options = webdriver.FirefoxOptions()
elif browser.lower()== 'ie':
options = webdriver.IeOptions()
self.driver=webdriver.Remote(remote_url,desired_capabilities=options.to_capabilities())
else:
if browser.lower() == 'chrome':
self.driver = webdriver.Chrome()
elif browser.lower() == 'firefox':
self.driver = webdriver.Firefox()
elif browser.lower() == 'ie':
self.driver = webdriver.Ie()
elif browser.lower() == 'safari':
self.driver = webdriver.Safari()
self.driver.maximize_window()
self.logger.info('浏览器初始化')
def get(self,url):
self.driver.get(url)
def find_element(self,ele_info):
# 名称、定位方法、属性值/文本/表达式、时间等待
# {'name':'登录按钮','type':'linktext','value':'登录','timeout':5}
# 解析 ele_info
name = ele_info['name']
type = ele_info['type']
value = ele_info['value']
timeout = ele_info['timeout']
# self.driver.find_element(By.LINK_TEXT,'登录')
locator =self.getBy(ele_info)
try:
wait = WebDriverWait(driver=self.driver, timeout=timeout)
element = wait.until(EC.presence_of_element_located(locator))
self.logger.info('查找【{}】使用【{},{}】定位成功'.format(name,type,value))
except Exception as e:
self.logger.info('查找【{}】使用【{},{}】定位失败,原因:{}'.format(name, type, value,e))
raise Exception('查找【{}】使用【{},{}】定位失败,原因:{}'.format(name, type, value,e))
return element
# 元素定位 针对不同方法封装 返回(By.LINK_TEXT,'xxxx')类型数据
def getBy(self,ele_info):
type = ele_info['type']
value = ele_info['value']
if type=='id':
locator = (By.ID,value)
elif type=='name':
locator = (By.NAME, value)
elif type=='classname':
locator = (By.CLASS_NAME, value)
elif type=='linktext':
locator = (By.LINK_TEXT, value)
elif type=='partial_link_text':
locator = (By.PARTIAL_LINK_TEXT, value)
elif type == 'tagname':
locator = (By.TAG_NAME, value)
elif type == 'css':
locator = (By.CSS_SELECTOR, value)
elif type == 'xpath':
locator = (By.XPATH, value)
else:
raise Exception(f'{type}不支持这种方式')
return locator
# 点击
def click(self, ele_info):
# element = self.find_element(ele_info)
# element.click()
# 点击元素拦截 加入时间等待机制-显式等待
name = ele_info['name']
# type = ele_info['type']
# value = ele_info['value']
timeout = ele_info['timeout']
locator = self.getBy(ele_info)
try:
wait = WebDriverWait(driver=self.driver, timeout=timeout)
wait.until(element_click_success(locator))
except Exception as e:
raise Exception('点击【{}】失败,原因:{}'.format(name, e))
# 输入
def send_keys(self,ele_info,text):
element = self.find_element(ele_info)
element.send_keys(text)
# 清空
def clear(self, ele_info):
element = self.find_element(ele_info)
element.clear()
# 鼠标悬浮
def move_to_element(self,ele_info):
element = self.find_element(ele_info)
action=ActionChains(self.driver)
action.move_to_element(element).perform()
# 窗口切换
def switch_to_window(self,index=-1):
handles = self.driver.window_handles
self.driver.switch_to.window(handles[index])
# 断言-是否包含某段文字
def page_contains(self,text):
try:
# 判断提示语在时间段内是否出现
# 通过显式等待 增加自定义函数-匿名函数
wait = WebDriverWait(driver=self.driver,timeout=10)
wait.until(lambda x:text in x.page_source)
return True
except Exception as e:
self.logger.debug('判断页面包含【{}】,失败原因:{}'.format(text,e))
return False
# 获取某个属性方法
def get_attribute(self,ele_info,attr_name):
element = self.find_element(ele_info)
return element.get_attribute(attr_name)
# 新增页面刷新
def refresh(self):
self.driver.refresh()
# 截图方法 返回结果二进制对象 不存储文件
def get_screenshot_as_png(self):
return self.driver.get_screenshot_as_png()
# 截图方法 存储文件
def get_screenshot_as_file(self,filename):
return self.driver.get_screenshot_as_file(filename)
# 关闭 quit 断开
def quit(self):
self.driver.quit()
# 定位元素并并点击 如果没有异常返回True
class element_click_success(object):
def __init__(self, locator): #
self.locator = locator # locator 指的是定位方式 和表达式或属性 (By.xpath,'XXX')
def __call__(self, driver): # call 把类变成可用对象 - 当前类作为函数对象 实现元素定位及点击
element = driver.find_element(*self.locator) # 元组 接受多个参数 拆包
try:
element.click()
print('元素查找并点击')
return True
except:
return False
if __name__ == '__main__':
driver = InitDriver()
driver.get('http://xxxx:8080/')
eleinfo = {'name':'登录按钮','type':'linktext','value':'登录','timeout':5}
driver.click(eleinfo)