python自动化之UI自动化框架搭建二(关键字驱动)
九、修改util报中的WaitUtil.py文件,如:iframe弹框;根据实际情况判断是否使用
# encoding=utf-8 from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 实现智能等待页面元素出现 class WaitUtil(object): def __init__(self, driver): self.locationTypeDict = { "xpath": By.XPATH, "id": By.ID, "name": By.NAME, "class_name": By.CLASS_NAME, "tag_name": By.TAG_NAME, "link_text": By.LINK_TEXT, "partial_link_text": By.PARTIAL_LINK_TEXT } self.driver = driver self.wait = WebDriverWait(self.driver, 10) def presenceOfElementLocated(self, locatorMethod, locatorExpression, *args): # 显示等待页面元素,元素不一定可见,存在则返回该页面元素对象 try: if self.locationTypeDict.has_key(locatorMethod.lower()): self.wait.until( EC.presence_of_element_located(( self.locationTypeDict[locatorMethod.lower()], locatorExpression))) else: raise TypeError('未找到定位方式,请确认定位方法是否正确') except Exception as e: raise e def visibility_element_located(self, locationType, locatorExpression): # 显示等待页面元素,元素可见,存在则返回该页面元素对象 try: element = self.wait.until(EC.visibility_of_element_located ((self.locationTypeDict[locationType.lower()], locatorExpression))) return element except Exception as e: raise e if __name__ == '__main__': from selenium import webdriver import time driver = webdriver.Chrome() driver.get("***") waitUtil = WaitUtil(driver) # waitUtil.frame_available_and_switch_to_it("id", "x-URS-iframe") e = waitUtil.visibility_element_located("xpath", "//*[@id='ssoLoginMode']/li[2]/a") e.click() # time.sleep(5) driver.quit()
十、KeyWordsFrameWork工程中新建一个action的python package,并在此包中新建一个PageAction.py文件,用于实现具体的页面动作,比如再输入框中输入数据,单击页面按钮等
# encoding=utf-8 from selenium import webdriver from KeyWordsFrameWork.util.ObjectMap import getElement from KeyWordsFrameWork.util.DirAndTime import * from KeyWordsFrameWork.util.WaitUtil import WaitUtil from selenium.webdriver.chrome.options import Options import time # 定义全局变量driver driver = None # 全局等待类实例对象 waitUtil = None def open_browser(browsername='chrome', *args): # 打开浏览器 global driver, waitUtil try: if browsername.lower() == 'chrome': driver = webdriver.Chrome() waitUtil = WaitUtil(driver) except Exception as e: raise e def visit_url(url, *args): # 访问某个网站 global driver try: driver.get(url) except Exception as e: raise e def close_browser(*args): # 关闭浏览器 global driver try: driver.quit() except Exception as e: raise e def sleep(sleepSeconds, *args): # 强制等待 try: time.sleep(int(sleepSeconds)) except Exception as e: raise e def clear(locationType, locatorExpression, *args): # 清楚输入框默认内容 global driver try: getElement(driver, locationType, locatorExpression).clear() except Exception as e: raise e def input_string(locationType, locatorExpression, inputContent): # 输入数据 global driver try: getElement(driver, locationType, locatorExpression).send_keys(inputContent) except Exception as e: raise e def click(locationType, locatorExpression, *args): # 单击页面元素 global driver try: element = getElement(driver, locationType, locatorExpression) # 防止点击时ElementClickInterceptedException异常,元素被遮挡;移动到这个元素后再点击 webdriver.ActionChains(driver).move_to_element(element).click(element).perform() # if args is None: # element.click() # else: # # 当元素无法可以定位到但被遮挡无法点击时,传入*args使用下面方法 # driver.execute_script("arguments[0].click();", element) except Exception as e: raise e def assert_string_in_pagesource(assertString, *args): # 断言页面源码是否存在某个关键字或关键字符串 global driver try: assert assertString in driver.page_source, \ '%s not found in page source!' % assertString except AssertionError as e: raise e except Exception as e: raise e def assert_title(titleStr, *args): # 断言页面标题是否存在给定的关键字符串 global driver try: assert titleStr in driver.title, \ '%s not found in title!' % titleStr except AssertionError as e: raise e except Exception as e: raise e def get_title(*args): # 获取页面标题 global driver try: return driver.title except Exception as e: raise e def getPageSource(*args): # 获取页面源码 global driver try: return driver.page_source except Exception as e: raise e def maximzie_browser(): # 窗口最大化 global driver try: driver.maximize_window() except Exception as e: e def capture_screen(*args): # 截取屏幕图片 global driver currTime = getCurrentTime() picNameAndPath = str(createCurrentDateDir()) + '/' + str(currTime) + '.png' try: driver.get_screenshot_as_file(picNameAndPath.replace('/', '/')) except Exception as e: raise e else: return picNameAndPath # 显示等待页面元素出现,但并不一定可见,存在则返回该页面元素对象 def waitPresenceOfElementLocated(locationType, locatorExpression, *args): global waitUtil try: waitUtil.presenceOfElementLocated(locationType, locatorExpression) except Exception as e: raise e # 显示等待页面元素出现,并且可见,存在则返回该页面元素对象 def waitVisibilityOfElementLocated(locationType, locatorExpression): global waitUtil try: waitUtil.visibility_element_located(locationType, locatorExpression) except Exception as e: raise e
十一、修改testScripts包中的TestCreatBuilding.py
# encoding=utf-8 from KeyWordsFrameWork.action.PageAction import * def TestCreatBuild(): # 启动chrome浏览器 open_browser('chrome') maximzie_browser() # 访问登录页 visit_url('https:****.com') sleep(5) assert_string_in_pagesource('***') print('访问登录页成功') # wait = WaitUtil(driver) # 切换登录方式 click("xpath", "//*[@id='ssoLoginMode']/li[2]/a") print('输入用户名') input_string("xpath", "//*[@id='username']", '****') print('输入登录密码') input_string("xpath", "//*[@id='password']", '****') print('登录') click('xpath', "//*[@id='accountLogin']/button") # 等待*秒,验证页面加载完成 sleep(5) assert_string_in_pagesource("***") print("登录成功") # 切换到building页面 click('xpath', '//*[@id="app"]/div/section/aside/div/ul/li[3]/div/span/span') sleep(1) click('xpath', '//*[@id="/area$Menu"]/li[1]/a/span') sleep(5) assert_title("***") print('进入***页面') # 点击创建按钮 click('xpath', '//*[@id="root"]/div/section/section/section/' 'main/div/div[2]/div/div/div[3]/div/div[1]/div[1]/' 'button') sleep(3) # 选择地址 click('xpath', '//*[@id="root"]/div/section/section/section/main/' 'div/div[2]/div/div/div/form/div[1]/div[3]/div[1]/' 'div[1]/div/div[2]/div/span/span/span') # 选择省市区 click('xpath', '//li[text()="北京"]') click('xpath', '/html/body/div[2]/div/div/div/ul[2]/li') click('xpath', '/html/body/div[2]/div/div/div/ul[3]/li[3]') # 录入详细地址 input_string('xpath', '//*[@id="address"]', '****') # 录入building名称 input_string('xpath', '//*[@id="name"]', '测试测试') # 点击building定位 click('xpath', '//*[@id="buildAdressMarker"]/button') sleep(3) # 点击提交按钮 click('xpath', '//*[@id="root"]/div/section/section/section/main/' 'div/div[2]/div/div/div/form/div[5]/div/button[1]') sleep(3) # 关闭保存成功提示 click('xpath', '//button/span[text()="OK"]', False) sleep(3) # 校验数据新建成功 assert_string_in_pagesource('测试测试') print('新建成功') close_browser() if __name__ == "__main__": TestCreatBuild()