定位元素
- 利用ID定位
driver.find_element_by_id("xx")
- 利用tag name定位
driver.find_element_by_tag_name("form")
- 利用link text定位
driver.find_element_by_link_text("新聞")
- 利用class name定位
driver.find_element_by_class_name("")
- 利用name定位
driver.find_element_by_name("")
- 利用css定位
driver.find_element_by_css_selector("")
Selenium自動化之高亮顯示
- 目的:
在UI自動化的時候,有時候我們需要查看運行的過程。
為了更好的顯示這個過程,可以進行元素高亮,以顯眼的顏色來提示測試人員目前的操作在哪一步。
- 解決方法;
使用js代碼來將元素的背景顏色和邊框顏色設(shè)置成綠色和紅色
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @創(chuàng)建時間: 2018/11/22 16:01
ele = driver.find_element('id','xxx') # 定位元素
driver.execute_script("arguments[0].setAttribute('style', arguments[1]);",ele, "background: green; border: 2px solid red;") # 元素的背景色和邊框設(shè)置成綠色和紅色
ele.click() # 元素高亮一般用于點擊事件之前,檢查元素定位是否正確,方便查看UI自動化的過程
Selenium妙招
利用select模塊處理下拉框
select提供了三種選擇某一項的方法
- select_by_index #通過索引定位
- select_by_value #通過value值定位
- select_by_visible_text #通過文本值定位
Selenium無法定位元素的9中解決方案
一、rame/iframe表單嵌套
- WebDriver只能在一個頁面上對元素識別與定位,對于frame/iframe表單內(nèi)嵌的頁面元素?zé)o法直接定位
- 解決方法:
xf = driver.find_element_by_xpath('//*[@class="if"]')
driver.switch_to.frame(xf)
driver.switch_to.parent_frame() #切到父frame。影響性能。
driver.switch_to.default_content() #跳回最外層到頁面
二、頁面跳轉(zhuǎn)到新的標(biāo)簽頁,或者彈出到警告框等
- 解決方法:
driver.switch_to.window(window_handle)切換到新窗口。
首先獲取當(dāng)前窗口等句柄deiver.current_window_handle,接著打開彈出新窗口,獲得當(dāng)前打開的所有窗口的句柄driver.window_handles。
通過for循環(huán)遍歷handle,如果不等于第一次打開窗口的句柄,那么一定是新窗口的句柄,因為執(zhí)行過程只打開了兩個窗口;
改變條件,如果等于第一次打開窗口的句柄,那么可以切換回第一次打開的窗口。
三、使用Xpath或CSS定位
- 如果一個元素沒有唯一屬性,那么我們可以一級一級向上查找,直到找到可以唯一定位元素的屬性,在向下查找其子元素
find_element_by_xpath("http://form[@id='form']/span[2]/input") #首先通過唯一標(biāo)識屬性id=form定位最外層元素,接著找到最外層元素下的第2個span標(biāo)簽為父元素,最后向下查找定位到父元素下標(biāo)簽為input的子元素。
- 如果一個元素不能唯一的區(qū)分一個元素,那么使用多個屬性來唯一地定位一個元素。
find_element_by_xpath('//input[@id='kw' and @class='su']/span/input) #首先找到標(biāo)簽為input,id=kw且class=su的元素,接著找到其下標(biāo)簽為span的子元素,繼續(xù)向下查找找到標(biāo)簽為input的子元素。
- 檢查Xpath描述是否有誤,導(dǎo)致無法定位到元素。
四、頁面還沒有加載出來,就對頁面上到元素進行操作。
- time.sleep()
五、元素被遮擋,不可用,不可見
- 方法1:
driver.maximize_window() #由于窗口大小改變引起的頁面元素布局發(fā)生變化,被測元素被遮擋,可以先將窗口最大化,再進行元素定位
- 方法2:
.is_enabled() #由于業(yè)務(wù)原因元素在某些情況下不可用(元素屬性disabled,灰顯),首先檢查測試步驟是否符合業(yè)務(wù)邏輯,其次確認(rèn)是否為業(yè)務(wù)流程上的Bug。
- 方法3:
.is_displayed() 對于屬性不一定可見的元素,在定位前首先判斷其屬性是否可見,是否被隱藏。
使用WebDriver調(diào)用JavaScript代碼代替無法實現(xiàn)到功能
"""選擇日期"""
day = (datetime.datetime.now() - datetime.timedelta(days=1)).strftime('%Y-%m-%d')
# 去掉開始日期元素的readonly屬性
js = 'document.getElementById("beginDate").removeAttribute("readonly");'
driver.execute_script(js)
# 清空文本后輸入值
driver.find_element_by_id("beginDate").clear()
driver.find_element_by_id("beginDate").send_keys(day)

WX20190820-154834@2x.png