Selenium 如何定位動態元素:
測試的時候會遇到元素每次變動的情況,例如:
<div id="btn-attention_2030295">...</div>
這個id 可能每次都不同,所以如何定位到該類元素呢?
1. 根據其他屬性定位
如果有其他固定屬性,最先考慮的當然是根據元素的其他屬性來定位,定位方式那么多,何必在這一棵樹上吊死。。
2.根據相對關系定位
根據其附近的父節點、子節點、兄弟節點定位,關於這方面,博主之前的一篇文章可作為參考:Python selenium —— 父子、兄弟、相鄰節點定位方式詳解
3.根據DOM順序index定位
這個很簡單,找到該元素在主文檔或某級父節點中的index,然后根據index可輕松定位,不過這種方式可能不夠穩定,如果可以,還是用其他的方法定位更加合適。
4.根據部分元素屬性定位
xpath中提供了三個非常好的方法來為我們定位部分屬性值:
driver.find_element_by_xpath("//div[contains(@id, 'btn-attention')]") driver.find_element_by_xpath("//div[starts-with(@id, 'btn-attention')]") driver.find_element_by_xpath("//div[ends-with(@id, 'btn-attention')]") # 這個需要結尾是‘btn-attention’
Selenium 顯式等待與隱式等待:
在selenium中(appium通用)常用的等待分為顯示等待WebDriverWait()、隱式等待implicitly_wait()、強制等待sleep()三種,下面我們就分別介紹一下這三種等待的區別
- sleep(): 強制等待,設置固定休眠時間。 python 的 time 包提供了休眠方法 sleep() , 導入 time 包后就可以使用 sleep(),進行腳本的執行過程進行休眠。
- implicitly_wait():隱式等待,也叫智能等待,是 webdirver 提供的一個超時等待。隱的等待一個元素被發現,或一個命令完成。如果超出了設置時間的則拋出異常。
- WebDriverWait():顯式等待,同樣也是 webdirver 提供的方法。在設置時間內,默認每隔一段時間檢測一次當前頁面元素是否存在,如果超過設置時間檢測不到則拋出異常。默認檢測頻率為0.5s,默認拋出異常為:NoSuchElementException
#添加智能等待
driver.implicitly_wait(30) #implicitly_wait()方法比 sleep() 更加智能,后者只能選擇一個固定的時間的等待,前者可以在一個時間范圍內智能的等待
driver.find_element_by_id("su").click()
public boolean isByElementDisplayed(By by, int time) { boolean status = false; if (driver.findElement(by).isDisplayed() == false) { driver.manage().timeouts().implicitlyWait(time, TimeUnit.SECONDS); } else { status = true; } return status; }
#添加固定休眠時間
sleep(5) #sleep()方法以秒為單位,假如休眠時間小時 1 秒,可以用小數表示。
driver.quit()
關於強制等待和隱式等待在上面注釋中已做了說明
下面主要介紹一下WebDriverWait() 顯示等待,語法格式如下:
python實例:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import NoAlertPresentException,TimeoutException,NoSuchElementException
driver=webdriver.Firefox()
driver.get("http:www.baidu.com")
WebDriverWait(driver,10,1,NoSuchElementException).until(lambda driver:driver.find_element_by_name("d_status"))
WebElement e = (new WebDriverWait( driver, 10)) .until( new ExpectedCondition< WebElement>(){ //等10秒直到找到id元素 @Override public WebElement apply( WebDriver d) { return d.findElement( By.id("id locator")); } } );
Selenium 基本API
參考: https://www.cnblogs.com/fnng/p/3968009.html
Open Browser
Close Browser Close All Browsers
Maximize Browser Window
Get Window Size
富文本編輯框推薦使用Js
String text = "你好呀"; String js = "document.getElementById('ueditor_0').contentDocument.write('" + text + "');"; ((JavascriptExecutor) driver).executeScript(js);
Testng 失敗后重試:
https://www.cnblogs.com/testway/p/6118148.html
xpath定位:
定位路徑可以是相對路徑,也可以是絕對路徑。絕對定位路徑以一個斜線“/”開頭,而相對定位路徑則沒有。如:/div/input 和 div/input
第一種方法:通過絕對路徑做定位
By.xpath("html/body/div/form/input")
By.xpath("//input")
第二種方法:通過元素索引定位
By.xpath("//input[4]")
第三種方法:使用xpath屬性定位(結合第2、第3中方法可以使用),前面用:tagName [@ 屬性='屬性值'] 表示
By.xpath("//input[@id='kw1']")
By.xpath("//input[@type='name' and @name='kw1']")
第四種方法:使用部分屬性值匹配(最強大的方法)
By.xpath("//input[start-with(@id,'nice')
By.xpath("//input[ends-with(@id,'很漂亮')
By.xpath("//input[contains(@id,'那么美')]")