二次封装
前言
我们学会了显示等待后,就不需要sleep了,然后查找元素方法用参数化去定位,这样定位方法更灵活了。但是这样写起来代码会很长,于是问题来了,总不能每次定位一个元素都要写一堆代码吧?这个时候就要学会封装。
由于显示等待相对于sleep来说更省时间,定位元素更靠谱,不会出现一会运行正常,一会又报错的情况,所以我们的定位需与WebdriverWait结合使用。
将定位方法、以及send_keys()、click()方法等一起封装,代码参考如下:
from selenium import webdriver 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 def browser(browser='chrome'): ''' 打开浏览器函数"chrome"、"firefox"、"edge"、"phantomjs" ''' try: if browser == "chrome": driver = webdriver.Chrome() return driver elif browser == "firefox": driver = webdriver.Firefox() return driver elif browser == "edge": driver = webdriver.Edge() return driver elif browser == "phantomjs": driver = webdriver.PhantomJS() return driver else: print("Not found this browser,You can enter 'chrome'、'firefox'、'edge'、'phantomjs'") except Exception as msg: print("%s" %msg) class MyLocation(): '''基于原生的selenium框架做了二次封装''' def __init__(self,driver): '''启动浏览器参数化,默认启动Chrome''' self.driver = driver def open(self,url,expected_title='',timeout=10): ''' 使用get打开url后,最大化窗口,判断title符合预期 Usage: driver = MyLocation() driver.open(url,expected_title='') ''' self.driver.get(url) self.driver.maximize_window() try: WebDriverWait(self.driver,timeout,1).until(EC.title_contains(expected_title)) except TimeoutException: print("open %s title error" %url) except Exception as msg: print("Error:%s" %msg) def find_element(self,locator,timeout=10): ''' 定位元素,参数locator是元组类型 Usage: locator = ("id","xxx") driver.find_element(locator) ''' element = WebDriverWait(self.driver,timeout,1).until(EC.presence_of_element_located(locator)) return element def find_elements(self,locator,timeout=10): ''' 定位一组元素,参数locator是元组类型 Usage: locator = ("id","xxx") driver.find_elements(locator) ''' elements = WebDriverWait(self.driver,timeout,1).until(EC.presence_of_all_elements_located_located(locator)) return elements def click(self,locator): ''' 点击操作 Usage: locator = ("id","xxx") driver.click(locator) ''' element = self.find_element(locator) element.click() def send_keys(self,locator,text): ''' 发送文本,清空后输入 Usage: locator = ("id","xxx") driver.send_keys(locator,text) ''' element = self.find_element(locator) element.clear() element.send_keys(text) def is_text_in_element(self,locator,text,timeout=10): ''' 判断文本在元素里,没定位到元素返回False,定位到返回判断结果布尔值 result = is_text_in_element(locator,text) ''' try: result = WebDriverWait(self.driver,timeout,1).until(EC.text_to_be_present_in_element(locator,text)) except TimeoutException: print("元素没定位到:"+str(locator)) return False else: return result def is_text_in_value(self,locator,value,timeout=10): ''' 判断元素的value值里,没定位到元素返回False,定位到返回判断结果布尔值 result = is_text_in_element(locator,value) ''' try: result = WebDriverWait(self.driver,timeout,1).until(EC.text_to_be_present_in_element_value(locator,value)) except TimeoutException: print("元素没定位到:"+str(locator)) return False else: return result def is_title(self,title,timeout=10): '''判断title完全等于''' result = WebDriverWait(self.driver,timeout,1).until(EC.title_is(title)) return result def is_title_contains(self,title,timeout=10): '''判断title包含''' result = WebDriverWait(self.driver,timeout,1).until(EC.title_contains(title)) return result def is_selected(self,locator,timeout=10): '''判断元素被选中,返回布尔值''' result = WebDriverWait(self.driver,timeout,1).until(EC.element_located_to_be_selected(locator)) return result def is_selected_be(self,locator,selected=True,timeout=10): '''判断元素的状态,selected是期望的参数True/False,返回布尔值''' result = WebDriverWait(self.driver,timeout,1).until(EC.element_located_selection_state_to_be(locator,selected)) return result def is_alert_present(self,timeout=10): '''判断页面是否有alert,有返回alert(注意这里不是返回True),没有返回False''' result = WebDriverWait(self.driver, timeout, 1).until(EC.alert_is_present()) return result def is_visibility(self,locator,timeout=10): '''元素可见返回本身,不可见返回False''' result = WebDriverWait(self.driver, timeout, 1).until(EC.visibility_of_element_located(locator)) return result def is_clickable(self,locator,timeout=10): '''元素可以点击is_clickable返回本身,不可点击返回False''' result = WebDriverWait(self.driver, timeout, 1).until(EC.element_to_be_clickable(locator)) return result def is_located(self,locator,timeout=10): '''判断元素有没有被定位到(并不意味着可见,定位到返回element,没定位到返回False)''' result = WebDriverWait(self.driver, timeout, 1).until(EC.presence_of_element_located(locator)) return result def move_to_element(self,locator): ''' 鼠标悬停操作 Usage: locator = ("id","xxx") driver.move_to_element(locator) ''' element = self.find_element(locator) ActionChains(self.driver).move_to_element(element).perform() def back(self): ''' Back to old window Usage: driver.back() ''' self.driver.back() def forward(self): ''' Forward to old window Usage: driver.forward() ''' self.driver.forward() def close(self): ''' Close the windows Usage: driver.close() ''' self.driver.close() def quit(self): ''' Quit the driver and close the windows Usage: driver.quit() ''' self.driver.quit() def get_title(self): '''获取title''' return self.driver.title def get_text(self,locator): '''获取文本''' element = self.find_element(locator) return element.text def get_attribute(self,locator,name): '''获取属性''' element = self.find_element(locator) return element.get_attribute(name) def js_execute(self,js): '''执行js''' return self.driver.execute_script(js) def js_focus_element(self,locator): '''聚焦元素''' target = self.find_element(locator) 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,locator,index): '''通过索引,index是索引的第几个,从0开始''' element = self.find_element(locator) Select(element).select_by_index(index) def select_by_value(self,locator,value): '''通过value属性''' element = self.find_element(locator) Select(element).select_by_value(value) def select_by_text(self,locator,text): '''通过文本值定位''' element = self.find_element(locator) Select(element).select_by_value(text) if __name__ == "__main__": # if下面的diam都是测试调试的代码,自测内容 driver = browser() driver_n = MyLocation(driver) # 返回类的实例,打开浏览器 driver_n.open("https://www.baidu.com") # 打开url,顺便判断打开的页面对不对 input_loc = ("id","kw") print(driver_n.get_title())

浙公网安备 33010602011771号