# 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()