FindBySample.py
# coding=utf-8 
''' 
    知识点:1、掌握selenium的8种元素定位方式 
    2、掌握使用get_attribute获取页面元素的属性以做验证 
    3、掌握find_elements 和 find_element的区别,以及元素数组的操作 
    4、页面中的复选框(checkBox)、单选框(radioButton)、下拉列表(list)、数据表格(grid)的操作 
    5、iframe框架的切换操作 
''' 
from selenium import webdriver 
from time import sleep 
import unittest 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.select import Select 
class WebDriverTests(unittest.TestCase): 
    def setUp(self): 
        #打开firefox的时候指定profile文件 
        profile = webdriver.FirefoxProfile("firefoxPro") 
        self.driver = webdriver.Firefox(profile) 
        self.driver.maximize_window() 
        self.driver.implicitly_wait(10) 
        print(" -- set up finished -- ") 
    def tearDown(self): 
        # close the browser window 
        self.driver.quit() 
        print('-- tear down finished -- ') 
    def test_01_FindBy_ID_maxlength(self): 
        self.driver.get('https://www.baidu.com/') 
        #按照ID=kw查找元素 
        search_field = self.driver.find_element_by_id("kw") 
        #验证找到的元素的maxlength是否是期望的长度 
        self.assertEqual("255", search_field.get_attribute("maxlength")) 
        print('-- test 01 按照ID查找元素,并验证 maxlength 属性成功 -- ') 
    def test_02_FindBy_Name_autocomplete(self): 
        self.driver.get('https://www.baidu.com/') 
        #按照name=wd查找元素 
        search_field = self.driver.find_element_by_name("wd") 
        #验证找到的元素的autocomplete属性是否为期望值 
        self.assertEqual("off", search_field.get_attribute("autocomplete")) 
        print('-- test 02 按照name查找元素,并验证 autocomplete 属性成功 -- ') 
 
    def test_03_FindBy_ClassName(self): 
        self.driver.get('https://www.baidu.com/') 
        #当按照class name只会匹配一个元素时,可以使用find_element_by_class_name 
        search_field = self.driver.find_element_by_class_name("s_ipt") 
        search_field.send_keys("你好ClassName")#输入内容 
        #验证百度输入框中的值是否等于刚输入的值 
        self.assertEqual("你好ClassName", search_field.get_attribute("value")) 
        self.driver.get("http://172.31.95.188:8090/ranzhi/www") 
        #sleep(2)     #这里加个延时,预防页面还没有完全打开程序就已经执行下去了 
        #当可以匹配到多个元素的时候,可以使用:find_elements(by=By.CLASS_NAME......,该函数返回一个元素数组变量 
        #find_elements(by=.... 可以针对8种定位方式定位元素,均会以数组形式返回所有符合条件的元素 
        classNames = self.driver.find_elements(by=By.CLASS_NAME, value="form-control") 
        #classNames = self.driver.find_elements(by=By.CLASS_NAME, value="form-control") 
        #classNames = self.driver.find_elements_by_class_name("form-control") 
        #循环元素并打印出所有元素的ID 
        for cn in classNames: 
            print("根据className找到的元素ID:%s"%cn.get_attribute("id")) 
            self.assertIn("请输入", cn.get_attribute("placeholder"))#检查是否有输入提示 
            print(cn.get_attribute("placeholder")) 
        self.assertEqual(2, len(classNames)) 
        print('-- test 03 按照class查找元素,并输入及验证成功 -- ') 
 
    def test_04_FindBy_TagName(self): 
        self.driver.get("http://172.31.95.188:8090/ranzhi/www") 
        #find_element_by_tag_name只返回符合条件的第一个元素 
        tagField = self.driver.find_element_by_tag_name("input") 
        #但是往往用标签定位会返回多个元素,因此建议使用find_elements方法 
        #tagFields = self.driver.find_elements(by=By.TAG_NAME, value="input") 
        tagFields = self.driver.find_elements_by_tag_name("input") 
        for inputF in tagFields: 
            if inputF.get_attribute("type")=="checkbox":    #如果类型是复选框 
                print("根据Tag Name找到复选框:ID=%s"%str(inputF.get_attribute("id"))) 
                if not inputF.is_selected():        #检查复选框有没有被选中 
                    inputF.click()                  #选中复选框 
            elif inputF.get_attribute("type")=="text":  #如果类型是文本输入框 
                print("根据Tag Name找到文本框:ID=%s"%str(inputF.get_attribute("id"))) 
                inputF.send_keys("随便的用户名") 
            elif inputF.get_attribute("type")=="password":  #如果类型是密码框 
                print("根据Tag Name找到密码框:ID=%s"%str(inputF.get_attribute("id"))) 
            elif inputF.get_attribute("type")=="submit":    #如果类型是提交按钮 
                print("根据Tag Name找到提交按钮:ID=%s"%str(inputF.get_attribute("id"))) 
        self.assertEqual(5, len(tagFields)) 
        print('-- test 04 按照tag Name查找元素成功 -- ') 
    def test_05_FindBy_LinkText(self):  #注意这种定位方式只能针对超链 
        self.driver.get('https://www.baidu.com/') 
        linkField = self.driver.find_element_by_link_text("登录") 
        linkField.click() 
        loginTitle = self.driver.find_element_by_id("TANGRAM__PSP_2__titleText") 
        self.assertEqual("登录百度账号", loginTitle.text)     #.text能将任何节点的可见文字得到 
        print('-- test 05 按照Link Text查找元素并验证是否跳转成功 -- ') 
 
    def test_06_FindBy_Partial_LinkText(self):#用局部的链接文字定位元素 
        self.driver.get('https://www.baidu.com/') 
        linkField = self.driver.find_element_by_partial_link_text("录") 
        linkField.click() 
        loginTitle = self.driver.find_element_by_id("TANGRAM__PSP_2__titleText") 
        self.assertEqual("登录百度帐号", loginTitle.text) 
        print('-- test 06 按照部分Link Text查找元素并验证是否跳转成功 -- ') 
 
    def test_07_FindBy_xPath(self): 
        self.driver.get("http://172.31.95.188:8090/ranzhi/www") 
        self.driver.find_element_by_id("account").send_keys("admin") 
        self.driver.find_element_by_id("password").send_keys("111111" + Keys.RETURN) 
        #用xpath绝对路径定位 
        xpathBtn = self.driver.find_element_by_xpath("/html/body/div/div[1]/div/ul[1]/li[1]/button") 
        #sleep(3) 
        #用xpath相对路径定位定位CRM图片按钮,意思就是找到一个class=...的button元素 
        xpathBtn = self.driver.find_element_by_xpath("//button[@class='app-btn s-menu-btn']") 
        #使用模糊匹配查找元素 
        xpathBtn = self.driver.find_elements_by_xpath("//button[contains(@class, 'pp-btn s-menu-bt')]")[0] 
        #这个方法是最稳定的,从一个固定ID的节点找到其子节点 
        xpathBtn = self.driver.find_element_by_xpath("//li[@id='s-menu-1']/button") 
        #xpathBtn = self.driver.find_element_by_xpath("//button[@data-original-title='客户管理']") 
        xpathBtn.click() 
 
        #frame操作,点击crm的合同按钮,先查找节点,然后根据节点进入 
        #frame_element = self.driver.find_element_by_name("iframe-1") 
        #self.driver.switch_to.frame(frame_element)#进入frame 
        #如果有ID属性 ID=iframe-1 
        self.driver.switch_to.frame("iframe-1")#进入frame 
        # 点击产品按钮 
        self.driver.find_element_by_link_text("产品").click() 
        #self.assertIn("维护产品",  self.driver.title) 
        #添加一个新产品 
        self.driver.find_element_by_link_text("添加产品").click() 
        self.driver.find_element_by_id("name").send_keys("101自动化测试产品") 
        #列表元素的操作,HTML中的select标签元素操作方式如下: 
        prodField = self.driver.find_element_by_id("line")  #产品线 
        prodSelect = Select(prodField) 
        prodSelect.select_by_index(1)                       #根据列表号选择 
        prodSelect.select_by_value("bb")                    #根据列表内值选择(最稳定) 
        prodSelect.select_by_visible_text("51测试产品线")  #根据列表显示内容选择 
        typeField = self.driver.find_element_by_id("type")  #类型 
        typeSelect = Select(typeField) 
        typeSelect.select_by_index(0)                       #根据列表号选择 
        self.driver.find_element_by_id("submit").click()    #保存产品 
        sleep(3) 
        #验证界面是否保存成功 
        prodName = self.driver.find_element_by_xpath("//table[@id='productList']/tbody/tr[1]/td[2]").text 
        self.assertEqual("101自动化测试产品", prodName) 
        sleep(3) 
        #点击联系人并添加新的联系人,尝试操作一下单选框(radioButton) 
        self.driver.find_element_by_link_text("联系人").click() 
        self.driver.find_element_by_link_text("添加联系人").click() 
        self.driver.find_element_by_id('gender2').click() 
 
        self.driver.switch_to.default_content() #退出frame 
 
        print('-- test 07 按照xPath查找元素并验证是否跳转成功 -- ') 
 
    def test_08_FindBy_CSS_Selector(self): 
        self.driver.get("http://172.31.95.188:8090/ranzhi/www") 
        self.driver.find_element_by_id("account").send_keys("admin") 
        self.driver.find_element_by_id("password").send_keys("111111" + Keys.RETURN) 
        #检查登录的用户名是否为期望的 
        userLogin = self.driver.find_element_by_css_selector("ul[class='nav navbar-nav']>li>a") 
        if userLogin.text == "admin": 
            print("PASS--登录成功:admin") 
        else: 
            print("FAIL--登录出现错误,期望用户为‘admin’,实际用户为‘%s’"%userLogin.text) 
        #查找“您今天的考勤状态为:迟到 去补录”中 “去补录” 链接 并点击 
        #定位div[class=alert] 下的 a[class=app-btn] 
        cssLink = self.driver.find_element_by_css_selector("div.alert a.app-btn") 
        cssLink.click() 
        #点击“客户”图标进入CRM客户模块 
        #定位id=s-menu-1下的button,由于只有一个button,因此该按钮不需再指定属性 
        cssBtn = self.driver.find_element_by_css_selector("#s-menu-1 > button") 
        cssBtn.click() 
        sleep(3) 
        self.assertEqual("客户管理 - 然之协同",  self.driver.title) 
        print('-- test 08 按照css查找元素并验证是否跳转成功 -- ') 
if __name__ == '__main__': 
    unittest.main()
posted on 2017-06-18 13:56  如果这是一场意外  阅读(357)  评论(0)    收藏  举报