Selenium 定位总结
原文由周小麗發(fā)表于TesterHome社區(qū),點擊原文鏈接與原文作者交流
xpath 有兩種表示方法,絕對路徑和相對路徑,絕對路徑是指從根開始,以/開始,如/html/body/div,相對路徑是指在一個路徑下,另外的路徑以這個路徑作為參照,以//開始。測試時,一般使用相對路徑查找元素 (安裝 ChroPath 插件,可以查找 xpath 路徑)。
xpath 用法來源于:https://www.cnblogs.com/purelavender/p/14512530.html
怎么提高 selenium 腳本的自動化執(zhí)行效率?
1、優(yōu)化測試用例,盡可不使用 sleep,減少使用 ImplicitlyWait,而使用 selenium 的 wait/FluentWait,這樣可以優(yōu)化等待時間
2、使用 selenium grid,通過 testng 實現(xiàn)并發(fā)執(zhí)行
3、 針對一些不穩(wěn)定的動態(tài)控件通過 JS 實現(xiàn)操作
4、重載 testng 的 listener 實現(xiàn) retry 機(jī)制,提高測試用例成功率
xpath 基本用法:
1、屬性定位 表示方法://標(biāo)簽名 [@ 屬性名=屬性值] ,通過單一的屬性即可查找到元素。如:查找輸入文本框,//input[@id=‘kw’]
2、and 組合屬性定位 表示方法://標(biāo)簽名 [@ 屬性名 1=屬性值 and 屬性名 2=屬性值],當(dāng)單一屬性無法定位唯一元素時,可以組合多個屬性進(jìn)行查找。如:查找輸入文本框,//input[@name=‘wd’ and @class=s_ipt]
3、通過父元素找子元素 表示方法: //父元素/子元素,當(dāng)查找的元素沒有特征屬性時,其父元素有特征屬性時,可以通過其父元素往下查找。如:查找輸入文本框,//span[@id=‘s_kw_wrap’]/input
4、通過祖先元素找子孫元素 表示方法://祖先元素//子孫元素,當(dāng)查找的元素沒有特征屬性時,其祖先元素有特征屬性時,可以通過其祖先元素往下查找。如:查找輸入文本框,//span[@id=‘s_kw_wrap’]//input
5、通過子元素找父元素 表示方法://子元素/…,當(dāng)查找的元素沒有特征屬性,其子元素有特征屬性時,可以通過其子元素往上查找。如:查找輸入文本框的父元素,//input[@id=‘kw’]/…
6、通過文本定位,表示方法://標(biāo)簽名 [text()=文本內(nèi)容](text 前不需要加 @ 符號),經(jīng)常和 contains() 組合使用。如,定位【新聞】對應(yīng)的 a 標(biāo)簽,//a[text()=‘新聞’]
7、通過 contains 模糊匹配定位,表示方法://標(biāo)簽名 [contains(屬性或文本, 內(nèi)容)]。如,定位頁面中的【設(shè)置】元素,//span[contains(@name, ‘tj’)]
8、通過索引 [] 定位 (注意:1、加括號;2、索引從 1 開始),如,定位【學(xué)術(shù)】對應(yīng)的 a 標(biāo)簽,(//a[@class=‘mnav c-font-normal c-color-t’])[7]
9、常用的軸運(yùn)算,表示方法:軸關(guān)系::標(biāo)簽名稱
ancestor:當(dāng)前元素的所有祖先元素(父、祖父等),如:通過【設(shè)置】查找其父級 div 元素,//span[@id=‘s-usersetting-top’]//ancestor::div[@id=‘u1’]
following-sibling:當(dāng)前元素之后的所有同級元素,如:查找【直播】之后的同級元素,//a[contains(text(), ‘直播’)]//following-sibling::a
preceding-sibling:當(dāng)前元素之前的所有同級元素,如:查找【直播】之前的同級元素,//a[contains(text(), ‘直播’)]//preceding-sibling::a
selenium 之 CSS 定位匯總
定位輸入框
一:單一屬性定位
1:type selector
driver.find_element_by_css_selector(‘input’)
2:id 定位
driver.find_element_by_css_selector(’#kw’)
3:class 定位
driver.find_element_by_css_selector(’.s_ipt’)
4:其他屬性定位
driver.find_element_by_css_selector(’[name=‘wd’]’)
driver.find_element_by_css_selector("[type=‘text’]")
二:組合屬性定位
1:id 組合屬性定位
driver.find_element_by_css_selector(“input#kw”)
2:class 組合屬性定位
driver.find_element_by_css_selector(“input.s_ipt”)
3:其他屬性組合定位
driver.find_element_by_css_selector(“input[name=‘wd’]”)
4:僅有屬性名,沒有值也可以
driver.find_element_by_css_selector(“input[name]”)
5:兩個其他屬性組合定位
driver.find_element_by_css_selector("[name=‘wd’][autocomplete=‘off’]")
三種等待的用法
ImplicitlyWait(隱式等待)
driver.implicitly_wait(10) # 設(shè)置隱式等待時間為 10s
是指對整個頁面的加載,隱式等待在 driver 的整個生命周期內(nèi)都有效。
也就是說,driver 在沒有被 close() 之前,定位每個元素時,都會有隱式等待的 10s,也就是說,只需要設(shè)置一次,所有的元素都可有最多 10s 的等待加載的時間
可是隱式等待依然存在一個問題,那就是程序會一直等待整個頁面加載完成,也就是通常狀況下你看到瀏覽器標(biāo)簽欄那個小圈再也不轉(zhuǎn),才會執(zhí)行下一步,但有時候頁面想要的元素早就在加載完成了,可是由于個別 js 之類的東西特別慢,我仍得等到頁面所有完成才能執(zhí)行下一步。因此,這里 webdriver 提供了一種更加智能的等待方式:顯示等待 spa
Explicit Wait(顯式等待)
wait = WebDriverWait(driver, 10) # 設(shè)置顯示等待時間為 10s
element = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ‘#kw’)))# 判斷條件
element.send_keys(“Python”)
彌補(bǔ)了 implicit wait 的不足,能夠經(jīng)過判斷一些條件,再去決定是否等待下去,顯示等待是一種智能程度較高的等待方式,能夠有效的加強(qiáng)腳本的健壯性
Fluent wait(流暢等待,即顯式等待的一種)
可以設(shè)置自己的方法去處理各種等待的問題。
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)//最大等待時間是60秒.withTimeout(60, TimeUnit.SECONDS)//每隔兩秒去找一次元素ele1是否在頁面顯示.pollingEvery(2, TimeUnit.SECONDS)//并且忽略NoSuchElement異常.ignoring(NoSuchElementException.class);//ele1定位過程使用了對象waitWebElement ele1 = wait.until(new Function<WebDriver, WebElement>() {//一個等待的條件public WebElement apply(WebDriver driver) {return driver.findElement(By.id("xxxxxxx"));} });上面創(chuàng)建了一個 FlentWait 類的一個對象 wait,最大等待時間是 60 秒,每隔兩秒去找一次元素 ele1 是否在頁面顯示。并且忽略 NoSuchElement 異常。下面的元素定位,ele1 定位過程使用了對象 wait,然后里面新建了一個函數(shù),只需要把這個函數(shù)當(dāng)做是一個等待的條件就很好理解。
以上是今天的分享,你學(xué)廢了嗎~
想學(xué)習(xí)更多干貨知識和前沿技術(shù)?
想結(jié)識測試行業(yè)大咖和業(yè)界精英?
歡迎關(guān)注2022 MTSC大會(第十屆中國互聯(lián)網(wǎng)測試開發(fā)大會)>>>
總結(jié)
以上是生活随笔為你收集整理的Selenium 定位总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ajax能用sesssion,解决Aja
- 下一篇: 思科设备配置DHCP命令