Selenium 定位元素原理,基本API,顯示等待,隱式等待,重試機制等等


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,'那么美')]")

 

 

 

            


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM