zoukankan      html  css  js  c++  java
  • Selenium二次封装Python版本

      1 from selenium import webdriver
      2 from selenium.webdriver.support.wait import WebDriverWait
      3 from selenium.webdriver.support import expected_conditions as EC
      4 from selenium.webdriver.common.by import By
      5 from selenium.webdriver.common.action_chains import ActionChains
      6 from selenium.webdriver.support.select import Select
      7 
      8 '''
      9     对selenium进行二次封装
     10 '''
     11 class PySelenium(object):
     12 
     13     '''
     14         初始化,实例化浏览器驱动对象
     15     '''
     16     def __init__(self, browser='ff'):
     17         if browser == 'ff' or browser == 'firefox': # 火狐
     18             driver = webdriver.Firefox()
     19         elif browser == 'chrome': # 谷歌
     20             option = webdriver.ChromeOptions()
     21             option.add_argument("--start-maximized")
     22             driver = webdriver.Chrome(chrome_options=option)
     23         elif browser == 'ie' | browser == 'internet explorer': # IE
     24             driver = webdriver.Ie()
     25         elif browser == "opera":
     26             driver = webdriver.Opera()
     27         elif browser == "phantomjs":
     28             driver = webdriver.PhantomJS()
     29         elif browser == 'edge':
     30             driver = webdriver.Edge()
     31 
     32         try:
     33             self.driver = driver
     34         except Exception:
     35             # 手动抛出异常
     36             raise NameError(
     37                 "Not found %s browser,You can enter 'ie', 'ff', 'opera', 'phantomjs', 'edge' or 'chrome'." % browser)
     38 
     39 
     40     '''
     41         设置元素等待
     42     '''
     43     def elementWait(self, css, secs=5):
     44         # 判断表达式是否包含指定字符
     45         if "=>" not in css:
     46             raise NameError("Positioning syntax errors, lack of '=>'.")
     47 
     48         # 提取元素定位方式和定位表达式
     49         by = css.split("=>")[0]
     50         value = css.split("=>")[1]
     51 
     52         if by == "id":
     53             WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located(By.ID,value))
     54         elif by == 'name':
     55             WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located(By.NAME,value))
     56         elif by == "class":
     57             WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located((By.CLASS_NAME, value)))
     58         elif by == "link_text":
     59             WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located((By.LINK_TEXT, value)))
     60         elif by == "xpath":
     61             WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located((By.XPATH, value)))
     62         elif by == "css":
     63             WebDriverWait(self.driver, secs, 1).until(EC.presence_of_element_located((By.CSS_SELECTOR, value)))
     64         else:
     65             raise NameError(
     66                 "Please enter the correct targeting elements,'id','name','class','link_text','xpath','css'.")
     67 
     68     '''
     69         获取指定元素对象
     70             表达式:  by=>value (by为定位方式,value为定位方式的表达式,例如:按照id定位某个元素,id=>"#")
     71     '''
     72     def getElement(self, css):
     73         if "=>" not in css:
     74             raise NameError("Positioning syntax errors, lack of '=>'.")
     75 
     76         by = css.split("=>")[0]
     77         value = css.split("=>")[1]
     78 
     79         if by == 'id':
     80             element = self.driver.find_element_by_id(value)
     81         elif by == 'name':
     82             element = self.driver.find_element_by_name(value)
     83         elif by == 'class':
     84             element = self.driver.find_element_by_class_name(value)
     85         elif by == 'link_text':
     86             element = self.driver.find_element_by_link_text(value)
     87         elif by == 'xpath':
     88             element = self.driver.find_element_by_xpath(value)
     89         elif by == 'css':
     90             element = self.driver.find_element_by_css_selector(value)
     91         else:
     92             raise NameError("Please enter the correct targeting elements,'id','name','class','link_text','xpath','css'.")
     93         return element
     94 
     95     '''
     96         请求/打开指定链接
     97     '''
     98     def openUrl(self, url):
     99         self.driver.get(url)
    100 
    101     '''
    102         窗口最大化
    103     '''
    104     def maxWindows(self):
    105         self.driver.maximize_window()
    106 
    107     '''
    108         设置窗口指定宽高
    109     '''
    110     def setWindowsSize(self, wide, high):
    111         self.driver.set_window_size(width=wide,height=high)
    112 
    113     '''
    114         添加文本到input
    115     '''
    116     def addText(self, css, massage):
    117         self.elementWait(css)
    118         input = self.getElement(css)
    119         input.send_keys(massage)
    120 
    121     '''
    122         清空input中的文本
    123     '''
    124     def clear(self, css):
    125         self.elementWait(css)
    126         self.getElement(css).clear()
    127 
    128     '''
    129         鼠标左键单击
    130     '''
    131     def click(self, css):
    132         self.elementWait(css)
    133         self.getElement(css).click()
    134 
    135     '''
    136         鼠标右键单击
    137     '''
    138     def rightClick(self, css):
    139         self.elementWait(css)
    140         ActionChains(self.driver).context_click(self.getElement(css)).perform()
    141 
    142     '''
    143         移动鼠标到指定元素(默认在元素的中间位置)
    144     '''
    145     def moveToTargetElement(self, css):
    146         self.elementWait(css)
    147         ActionChains(self.driver).move_to_element(self.getElement(css)).perform()
    148 
    149     '''
    150         移动鼠标到指定元素,并且指定位于元素的x,y偏移量(偏移量相对于元素的左上角)
    151     '''
    152     def moveToTargetElementWithOffset(self, css, xoffset, yoffset):
    153         self.elementWait(css)
    154         ActionChains(self.driver).move_to_element_with_offset(self.getElement(css), xoffset, yoffset).perform()
    155 
    156     '''
    157         鼠标左键双击
    158     '''
    159     def doubleClick(self, css):
    160         self.elementWait(css)
    161         ActionChains(self.driver).double_click(self.getElement(css)).perform()
    162 
    163     '''
    164         拖拽元素到指定元素处
    165     '''
    166     def dragAndDropToElement(self, sourceCss, targetCss):
    167         self.elementWait(sourceCss)
    168         self.elementWait(targetCss)
    169         ActionChains(self.driver).drag_and_drop(self.getElement(sourceCss),self.getElement(targetCss)).perform()
    170 
    171     '''
    172         拖拽元素指定偏移(该偏移是相对于当前鼠标的坐标偏移量)
    173     '''
    174     def dragAndDropToOffset(self, sourceCss, xoffset, yoffset):
    175         self.elementWait(sourceCss)
    176         ActionChains(self.driver).drag_and_drop_by_offset(self.getElement(sourceCss), xoffset, yoffset).perform()
    177 
    178     '''
    179         鼠标左键点击链接文本
    180     '''
    181     def clickLinkText(self, text):
    182         self.driver.find_element_by_partial_link_text(text).click()
    183 
    184     '''
    185         关闭当前窗口
    186     '''
    187     def close(self):
    188         self.driver.close()
    189 
    190     '''
    191         关闭浏览器驱动
    192     '''
    193     def quit(self):
    194         self.driver.quit()
    195 
    196     '''
    197         提交指定表单
    198     '''
    199     def submit(self, css):
    200         self.elementWait(css)
    201         self.getElement(css).submit()
    202 
    203     '''
    204         刷新当前页面,相当于点击F5
    205     '''
    206     def F5(self):
    207         self.driver.refresh()
    208 
    209     '''
    210         执行指定的js代码
    211     '''
    212     def js(self, javaScript):
    213         self.driver.execute_script(javaScript)
    214 
    215     '''
    216         获取指定元素的某个属性值
    217     '''
    218     def getAttribute(self, css, attr):
    219         self.elementWait(css)
    220         self.getElement(css).get_attribute(attr)
    221 
    222     '''
    223         获取指定元素的文本内容,即value属性值
    224     '''
    225     def getText(self, css):
    226         self.elementWait(css)
    227         self.getElement(css).text
    228 
    229     '''
    230         判断元素是否可见
    231     '''
    232     def isDisplay(self, css):
    233         self.elementWait(css)
    234         return self.getElement(css).is_displayed()
    235 
    236     '''
    237         判断元素是否启用
    238     '''
    239     def isEnabled(self, css):
    240         self.elementWait(css)
    241         return self.getElement(css).is_enabled()
    242 
    243     '''
    244         判断元素是否选中,一般用于验证checkbox和radio
    245     '''
    246     def isSelected(self, css):
    247         self.elementWait(css)
    248         return self.getElement(css).is_selected()
    249 
    250     '''
    251         获取当前页面的title
    252     '''
    253     def getTitle(self):
    254         return self.driver.title
    255 
    256     '''
    257         获取当前页面的url
    258     '''
    259     def getCurrentUrl(self):
    260         return self.driver.current_url
    261 
    262     '''
    263         截图,保存到指定路径下文件中
    264     '''
    265     def getScreenshot(self, fullFileName):
    266         self.driver.get_screenshot_as_file(fullFileName)
    267 
    268     '''
    269         全局等待,Implicitly wait.All elements on the page.
    270     '''
    271     def wait(self, secs):
    272         self.driver.implicitly_wait(secs)
    273 
    274     '''
    275         弹框警告-确认
    276     '''
    277     def alertAccept(self):
    278         # self.driver.switch_to_alert().accept() 废弃的方式
    279         self.driver.switch_to.alert.accept()
    280 
    281     '''
    282         弹框警告-取消
    283     '''
    284     def alertDismiss(self):
    285         # self.driver.switch_to_alert().dismiss() 废弃的方式
    286         self.driver.switch_to.alert.dismiss()
    287 
    288     '''
    289         切换到指定的iframe
    290     '''
    291     def switchFrame(self, css):
    292         self.elementWait(css)
    293         self.driver.switch_to.frame(self.getElement(css))
    294 
    295     '''
    296         切换到上一级(iframe)
    297     '''
    298     def switchFrameOut(self):
    299         self.driver.switch_to.default_content()
    300 
    301     '''
    302         打开新页面,并切换当前句柄为新页面的句柄
    303         (每个页面对应一个句柄handle,可以通过self.driver.window_handles查看所有句柄)
    304         --当前方法可能存在问题
    305     '''
    306     def openNewWindow(self):
    307         original_windows = self.driver.current_window_handle
    308         all_handles = self.driver.window_handles
    309         for handle in all_handles:
    310             if handle != original_windows:
    311                 self.driver.switch_to.window(handle)
    312 
    313 
    314     '''
    315         等待元素,默认5秒,每1秒检查一次
    316             --如果超时则对当前页面截图,以指定的文件名称保存到图片存储目录,并返回false
    317     '''
    318     def waitEleAndSaveExceptionForTimeout(self, css, pictureName):
    319         try:
    320             self.elementWait(css)
    321             return True
    322         except Exception as e:
    323             from conf.path import PICTUREPATH  # 导入定义的图片存储目录路径
    324             pictureFullName = PICTUREPATH + pictureName + '.jpg'
    325             self.getScreenshot(pictureFullName)
    326             return False
    327 
    328     '''
    329         等待元素,10秒,每1秒检查一次
    330             --如果超时,返回false
    331     '''
    332     def waitEleAndExceptionForTimeout(self, css):
    333         try:
    334             self.element_wait(css, secs=10)
    335             return True
    336         except Exception as e:
    337             return False
    338 
    339     '''
    340         根据指定的值选中相应的下拉列表中的选项
    341             --如果没有指定的值则抛出异常
    342     '''
    343     def selectByValue(self, css, value):
    344         self.element_wait(css)
    345         Select(self.get_element(css)).select_by_value(value)
    346 
    347 if __name__ == '__main__':
    348     pySelenium = PySelenium('chrome')
  • 相关阅读:
    Linux内核分析第十八章读书笔记
    Linux内核分析作业 NO.5
    Linux内核分析第五章读书笔记
    Linux内核分析 一二章读书笔记
    Linux内核分析作业 NO.4
    Linux内核分析 NO.3
    Linux内核分析作业 NO.2
    Linux内核分析作业 NO.1
    论自我,论异类——《无声告白》
    愿随命运颠沛流离——《孤儿列车》读后感
  • 原文地址:https://www.cnblogs.com/wang1001/p/9556134.html
Copyright © 2011-2022 走看看