EasyUI selenium自动化的一些总结

时间:2021-08-10 06:02:52
最近一直在做关于EasyUI的自动化测试,以下是一些总结,包含几个常用函数,还有一些小技巧
1、读取一张表中的某个数据的函数
def res(self,row,column):
        driver = self.driver
        if row == 1:
            xpath = "/html/body/form/table[2]/tbody/tr["+str(row)+"]/th["+str(column)+"]"
        else:
            xpath = "/html/body/form/table[2]/tbody/tr["+str(row)+"]/td["+str(column)+"]"
        content = driver.find_element_by_xpath(xpath)
        print "%s/%s || %s" %(row,column,content.text)
输入行号和列即可读取这张表中的各个数据
例如:一张表,在结果中每页显示20条数据,超过即有一下页数标识,可以先查找是否存在多页,判断该页的表格的行数,然后读取其中某一列的数据(列数起始为1)
import string
if string.atoi(driver.find_element_by_id("PageControl1_lbPageCount").text,10)==1:
            num=string.atoi(driver.find_element_by_id("PageControl1_LblRight").text[2:-2],10)
else:num=20 
print num
for row in range(1,num,1):
     self.res(row,10)#读取第十列的值

2、截屏函数
(1)windows截屏
import win32gui, win32ui, win32con, win32api

def window_capture(self):
         hwnd = 0
         hwnddc = win32gui.GetWindowDC(hwnd)
         mfcdc=win32ui.CreateDCFromHandle(hwnddc)
         savedc=mfcdc.CreateCompatibleDC()
         savebitmap = win32ui.CreateBitmap()
         moniterdev=win32api.EnumDisplayMonitors(None,None)
         w = moniterdev[0][2][2]
         h = moniterdev[0][2][3]
         savebitmap.CreateCompatibleBitmap(mfcdc, w, h)
         savedc.SelectObject(savebitmap)
         savedc.BitBlt((0,0),(w, h) , mfcdc, (0,0), win32con.SRCCOPY)
         T=time.strftime("%d%H%M%S",time.localtime(time.time()))
         bmpname=win32api.GetTempFileName(".","")[0]+T+'.bmp'
         savebitmap.SaveBitmapFile(savedc, bmpname)
         #return bmpname
         print bmpname
(2)selenium中的截屏
def screenshoot(self,name='error',testpath='D:\\SeleniumScreenshoot'):
        if os.path.exists(testpath)==False:
            #print '不存在'
            os.makedirs(testpath+'\\')
        T=time.strftime("%H%M%S",time.localtime(time.time()))
        filename=testpath+'\\'+name+T+'.png'
        self.driver.get_screenshot_as_file(filename)
这个函数只是方便了每次测试的截屏的命名与存放,每一个步骤可以单独对测试结果命名,并标记上时间
def Login(self,name,pwd):
        try:
            driver=self.driver
            driver.find_element_by_id("username").clear()
            driver.find_element_by_id("username").send_keys("zhangsan")
            driver.find_element_by_id("pwd").clear()
            driver.find_element_by_id("pwd").send_keys("123456")
            driver.find_element_by_id("submit_login").click()
            time.sleep(10)
            #driver.implicitly_wait(100)
            driver.find_element_by_id("ext-gen19").click()
            driver.implicitly_wait(60)
        except Exception,e:
            self.screenshoot('LoginError')
            return 0
        return 1



3、js函数
(1)浏览器滚动条控制函数
def Bar (self, height):
        browser = self.driver
        try:
            setscroll = "var q=document.documentElement.scrollTop=" + str(height)
            browser.execute_script(setscroll)
        except Exception,e:
            self.screenshoot('Scroll Bar Error')
            return 0
        return 1
height为滚动条高度控制
(2)可以通过JavaScript来获取一个type=hidden的元素
js="document.getElementById(\"warning\").type ='text';"
browser.execute_script(js)

4、无明显标志的frame的定位方式
    def Frame(self,xpath):
        driver=self.driver
        A=driver.find_element_by_xpath(xpath) #"/html/body/div/div[2]/div/div[2]/div/div/iframe"
        driver.switch_to.frame(A)
并非一定要写成一个函数,但是可以在一个页面嵌套了多个iframe的时候写成一个函数。在EasyUI中常常要定位iframe。

5、日期控件的操作
日期控件有很多种操作方式,如果在写代码前就发现是可以直接写入的当然最好,但是有时候自动写入了点击确定却不能生效,这个时候可以试一下,填完不点确定,而是直接点击其他输入窗口进行下一项输入,或者直接点击搜索。在我这段时间的测试中,都可以用这样的方式输入日期

6、下拉菜单
from selenium.webdriver.support import select
select.Select(browser.find_element_by_tag_name("select")).select_by_value("1")
或者通过选项的次序定位select.Select(browser.find_element_by_tag_name("select")).select_by_index(2)
还可以使用xpath来进行定位
driver.find_element_by_xpath("//option[value='1']").click()

7、保存本地网页
把自己写的html网页放在当前路径下。在一些业务流程的自动化测试中,每次定位某个元素都要重新跑一遍流程,十分浪费时间,可以将整个网页下载,然后单独在这个网页上定位,成功后再复制代码。
filepath = 'file:///'+os.path.abspath('xiala.html')
browser.get(filepath)

8、获取tag的某个属性值:
imput.get_attribute('type') 获取input标签的type属性的值
例:if input.get_attribute("type")=='checkbox':
     input.click()
有时定位的时候通过属性值过滤
driver.find_elements_by_css_selector("input[type=checkbox]")

9、非常强大的find_element_by_css_selector()
该<a>元素存在class="ct"属性,可以直接写find_element_by_css_selecor("a.ct")
该<a>元素存在id="ct"号,可以直接写find_element_by_css_selecor("a#ct")
其他属性,可以在tag名后加[属性名=属性],如find_element_by_css_selecor("a[title="ct"]")

10、切换浏览器窗口
def switch(self,close=1):
        """close=0,保留之前的窗口,close=1,关闭之前的窗口,默认关闭"""
        driver = self.driver
        before = driver.current_window_handle
        all_handles = driver.window_handles
        for handle in all_handles:
            if handle != before:
                if close==1:
                    driver.close()
                driver.switch_to.window(handle)