页面元素:浏览器上能显示的所有要素,如图片、文本框、按钮、下拉列表、视频等。
自动化测试的主要步骤:
WebDriver定位元素的9种方式及操作:-----------学习链接
①、id属性定位---------->driver.find_element_by_id(“id属性值”);
②、name属性定位----------------->driver.find_element_by_name(“name属性值”);
③、class name 属性定位--------->driver.find_element_by_class_name(“类名”);
④、link test属性定位------------->find_element_by_link_text(“链接显示的文本”)
# 文字完全匹配定位
driver.find_element_by_link_text("学术").click()
# 文字部分匹配定位
driver.find_element_by_partial_link_text("论文").click()
⑤、tag name属性定位----------------->find_element_by_tag_name(“标签名”);
# 方式1:定位指定页面上input标签的元素(自上而下找到第1个input)
driver.find_element_by_tag_name("input").send_keys("Selenium")
# 方式2:定位所有input标签中指定的某一个input(此处[0]代表第1个input标签)
# 以下需要用elements,因为是对页面上的所有input标签形成集合
driver.find_elements_by_tag_name("input")[0].send_keys("Selenium")
⑥、partial link test(类似link test)------------->find_element_by_partial_link_text(“部分链接显示的文本”);
⑦、xpath--------------->find_element_by_xpath(“xpath”)
XPath:即XML路径语言,是一种用来确定XML文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。
获取属性的路径:
//* ------->表示所有标签
利用元素属性定位: //input[@id='kw'] ------->表示找到id = kw 的input 标签;
//input[@class = '??']------>找到class = ?? 的input 标签
利用父子关系以及属性定位:先定位父亲位置,再定位儿子位置 //*[@id='form']/span[1]/span
利用逻辑运算符:通过一个元素无法定位,有重复的,可用两个或多个来定位
//input[@id = '1' and @name = '2']--->表示找到id=1并且name=2的input标签
driver.get("https://www.baidu.com")
# 根据XPath绝对路径定位到Baidu输入框中的相机按钮,并点击之
driver.find_element_by_xpath("//*[@id='form']/span[1]/span").click()
sleep(3)
# 根据XPath相对路径定位到上传图片的链接输入框,并输入设定的url字符串
driver.find_element_by_xpath("//*[@id='soutu-url-kw']").send_keys("www.baidu.com")
sleep(3)
# 根据XPath绝对路径定位到上传图片弹框的关闭按钮,并点击之
driver.find_element_by_xpath("//*[@id='form']/div/a").click()
⑧、css------------------>find_element_by_css_selector();
Selenium极力推荐使用CSS定位,而非XPath来定位元素,原因是CSS定位比XPath效率高速度快,语法也更加简洁。
find_element_by_css_selector()
#id
(id选择器,根据id属性来定位元素,#作为id的标志).class
(class选择器,根据class属性值来定位元素,.作为class [css类] 的标志)[attribute='value']
(根据属性来定位元素)element > element
(根据元素层级来定位: 父元素>子元素)# 根据元素层级来定位
driver.find_element_by_css_selector("#form > span.bg.s_ipt_wr.quickdelete-wrap > span").click()
driver.find_element_by_css_selector("#form > div > a").click()
sleep(2)
# 根据id来定位
driver.find_element_by_css_selector('#kw').send_keys("Python")
# 根据class定位
driver.find_element_by_css_selector('.s_ipt').send_keys("自动化测试")
# 根据属性来定位
driver.find_element_by_css_selector("[autocomplete='off']").send_keys("Selenium")
driver.find_element_by_id('su').click()
ActionChains(driver).double_click(DoubleClick).perform()#双击
ActionChains(driver).context_click(RightClick).perform()#右击
ActionChains(driver).drag_and_drop(Start, End).perform()#拖放
ActionChains(driver).move_to_element(Above).perform()#悬停
ActionChains(driver).click_and_hold(leftclick).perform()#按下
send_keys(Keys.BACK_SPACE) # BackSpace 删除键
send_keys(Keys.SPACE) # Space 空格键
send_keys(Keys.TAB) # Tab 制表键
send_keys(Keys.ESCAPE) # Esc ESC键
send_keys(Keys.ENTER) # Enter 回车键
send_keys(Keys.CONTROL,‘a’) # Ctrl+A 全选
send_keys(Keys.CONTROL,‘c’) # Ctrl+C 复制
send_keys(Keys.CONTROL,‘x’) # Ctrl+X 剪切
send_keys(Keys.CONTROL,‘v’) # Ctrl+V 粘贴
send_keys(Keys.F1) # 键盘F1
WebDriverWait(**driver, timeout, poll_frequency=0.5, ignored_exceptions=None**).until( EC.条件实现((By类定位方式, 定位值), message))
显示等待:主要正对某个元素,在规定时间内,可见、可点击、等等,超出时间则抛出异常
隐士等待:主要正对整个页面,在规定时间内,整个页面加载完成,才执行下一步,超出时间则抛出异常
显示等待和隐士等待同时存在时,看谁的时间长,就取谁的等待时间
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
base_url = "http://www.baidu.com"
driver = webdriver.Firefox()
driver.implicitly_wait(5)
'''隐式等待和显示等待都存在时,超时时间取二者中较大的'''
locator = (By.ID,'kw')
driver.get(base_url)
WebDriverWait(driver,10).until(EC.title_is(u"百度一下,你就知道"))
'''判断title,返回布尔值'''
WebDriverWait(driver,10).until(EC.title_contains(u"百度一下"))
'''判断title,返回布尔值'''
WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'kw')))
'''判断某个元素是否被加到了dom树里,并不代表该元素一定可见,如果定位到就返回WebElement'''
WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.ID,'su')))
'''判断某个元素是否被添加到了dom里并且可见,可见代表元素可显示且宽和高都大于0'''
WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(by=By.ID,value='kw')))
'''判断元素是否可见,如果可见就返回这个元素'''
WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'.mnav')))
'''判断是否至少有1个元素存在于dom树中,如果定位到就返回列表'''
WebDriverWait(driver,10).until(EC.visibility_of_any_elements_located((By.CSS_SELECTOR,'.mnav')))
'''判断是否至少有一个元素在页面中可见,如果定位到就返回列表'''
WebDriverWait(driver,10).until(EC.text_to_be_present_in_element((By.XPATH,"//*[@id='u1']/a[8]"),u'设置'))
'''判断指定的元素中是否包含了预期的字符串,返回布尔值'''
WebDriverWait(driver,10).until(EC.text_to_be_present_in_element_value((By.CSS_SELECTOR,'#su'),u'百度一下'))
'''判断指定元素的属性值中是否包含了预期的字符串,返回布尔值'''
#WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it(locator))
'''判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False'''
#注意这里并没有一个frame可以切换进去
WebDriverWait(driver,10).until(EC.invisibility_of_element_located((By.CSS_SELECTOR,'#swfEveryCookieWrap')))
'''判断某个元素在是否存在于dom或不可见,如果可见返回False,不可见返回这个元素'''
#注意#swfEveryCookieWrap在此页面中是一个隐藏的元素
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='u1']/a[8]"))).click()
'''判断某个元素中是否可见并且是enable的,代表可点击'''
driver.find_element_by_xpath("//*[@id='wrapper']/div[6]/a[1]").click()
#WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='wrapper']/div[6]/a[1]"))).click()
#WebDriverWait(driver,10).until(EC.staleness_of(driver.find_element(By.ID,'su')))
'''等待某个元素从dom树中移除'''
#这里没有找到合适的例子
WebDriverWait(driver,10).until(EC.element_to_be_selected(driver.find_element(By.XPATH,"//*[@id='nr']/option[1]")))
'''判断某个元素是否被选中了,一般用在下拉列表'''
WebDriverWait(driver,10).until(EC.element_selection_state_to_be(driver.find_element(By.XPATH,"//*[@id='nr']/option[1]"),True))
'''判断某个元素的选中状态是否符合预期'''
WebDriverWait(driver,10).until(EC.element_located_selection_state_to_be((By.XPATH,"//*[@id='nr']/option[1]"),True))
'''判断某个元素的选中状态是否符合预期'''
driver.find_element_by_xpath(".//*[@id='gxszButton']/a[1]").click()
instance = WebDriverWait(driver,10).until(EC.alert_is_present())
'''判断页面上是否存在alert,如果有就切换到alert并返回alert的内容'''
print instance.text
instance.accept()
driver.close()