最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

技術分享 | Web自動化之顯式等待與隱式等待

2022-04-27 11:44 作者:愛測軟件測試  | 我要投稿


等待就是當運行代碼時,如果頁面的渲染速度跟不上代碼的運行速度,就需要人為的去限制代碼執(zhí)行的速度。

在做 Web 自動化時,一般要等待頁面元素加載完成后,才能執(zhí)行操作,否則會報找不到元素等各種錯誤,這樣就要求在有些場景下加上等待。

最常見的有三種等待方式:

  • 隱式等待

  • 顯式等待

  • 強制等待

后面會一一介紹這三種模式的使用場景。

隱式等待

設置一個等待時間,輪詢查找(默認 0.5 秒)元素是否出現(xiàn),如果沒出現(xiàn)就拋出異常。這也是最常見的等待方法。

隱式等待的作用是全局的,是作用于整個 session 的生命周期,也就是說只要設置一次隱式等待,后面就不需要設置。如果再次設置隱式等待,那么后一次的會覆蓋前一次的效果。

當在 DOM 結構中查找元素,且元素處于不能立即交互的狀態(tài)時,將會觸發(fā)隱式等待。

  • Python 版本

self.driver.implicitly_wait(30)

  • Java 版本

//隱式等待調用方式,設置等待時間為5秒driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

顯式等待

顯式等待是在代碼中定義等待條件,觸發(fā)該條件后再執(zhí)行后續(xù)代碼,就能夠根據(jù)判斷條件進行等待。程序每隔一段時間進行條件判斷,如果條件成立,則執(zhí)行下一步,否則繼續(xù)等待,直到超過設置的最長時間。核心用法如下:

  • Python 版本

# 導入顯示等待

from selenium.webdriver.support.wait import WebDriverWait

from selenium.webdriver.support import expected_conditions

...

# 設置10秒的最大等待時間,等待 (By.TAG_NAME, "title") 這個元素點擊

WebDriverWait(driver, 10).until(

? ? expected_conditions.element_to_be_clickable((By.TAG_NAME, "title"))

)

...


這里通過導入 expected_conditions 這個庫來滿足顯式等待所需的使用場景,但是 expected_conditions 庫并不能滿足所有場景,這個時候就需要定制化開發(fā)來滿足特定場景。

  • Java 版本

import org.openqa.selenium.support.ui.ExpectedConditions;

import org.openqa.selenium.support.ui.WebDriverWait;


...

// 設置10秒的最大等待時間,等待 (By.TAG_NAME, "title") 這個元素點擊

WebDriverWait wait = new WebDriverWait(driver,10);

wait.until(ExpectedConditions.elementToBeClickable(By.tagName("title")));

...


假設:要判斷某個元素超過指定的個數(shù),就可以執(zhí)行下面的操作。

實戰(zhàn)演練

def ceshiren():

# 定義一個方法

def wait_ele_for(driver):

# 將找到的元素個數(shù)賦值給 eles

? ? ? ? eles = driver.find_elements(By.XPATH, '//*[@id="site-text-logo"]')

# 放回結果

return len(eles) > 0

? ? driver = webdriver.Chrome()

? ? driver.get('https://ceshiren.com')

# 顯示等待10秒,直到 wait_ele_for 返回 true

? ? WebDriverWait(driver, 10).until(wait_ele_for)

void ceshiren(){

? ? webDriver = new ChromeDriver();

? ? webDriver.get("https://ceshiren.com");

//顯示等待10秒,直到 wait_ele_for 返回 true

new WebDriverWait(webDriver,10).until((ExpectedCondition<Boolean>) size -> waitEleFor());

}

// 定義一個方法

boolean waitEleFor(){

// 將找到的元素個數(shù)賦值給 eles

? ? List<WebElement> elements = webDriver.findElements(By.xpath("//*[@id='site-text-logo']"));

return elements.size() > 0;

}

強制等待

強制等待是使線程休眠一定時間。強制等待一般在隱式等待和顯式等待都不起作用時使用。示例代碼如下

  • Python 版本

# 等待十秒time.sleep(10)

  • Java 版本

// 等待2000毫秒,相當于等待2秒Thread.sleep(2000)

實戰(zhàn)演示

訪問測試人社區(qū):https://ceshiren.com,點擊分類,然后點擊答疑區(qū):

當點擊分類時,元素還未加載完成,這里就需要隱式等待。在點擊答疑區(qū)時,元素已加載完成,但是還處在不可點擊的狀態(tài),這時要用到顯式等待。


#導入依賴

import time

from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.support import expected_conditions

from selenium.webdriver.support.wait import WebDriverWait


class TestHogwarts():

def setup(self):

? ? ? ? self.driver = webdriver.Chrome()

? ? ? ? self.driver.get('https://ceshiren.com/')

#加入隱式等待

? ? ? ? self.driver.implicitly_wait(5)


def teardown(self):

#強制等待

? ? ? ? time.sleep(10)

? ? ? ? self.driver.quit()


def test_hogwarts(self):

#元素定位,這里的category_name是一個元組。

? ? ? ? category_name = (By.LINK_TEXT, "開源項目")

# 加入顯式等待

? ? ? ? WebDriverWait(self.driver, 10).until(

? ? ? ? ? ? expected_conditions.element_to_be_clickable(category_name))

# 點擊開源項目

? ? ? ? self.driver.find_element(*category_name).click()

import org.junit.jupiter.api.AfterAll;

import org.junit.jupiter.api.BeforeAll;

import org.junit.jupiter.api.Test;

import org.openqa.selenium.By;

import org.openqa.selenium.chrome.ChromeDriver;

import org.openqa.selenium.support.ui.ExpectedConditions;

import org.openqa.selenium.support.ui.WebDriverWait;


import java.util.concurrent.TimeUnit;


public class WebDriverWaitTest {

private static ChromeDriver driver;

@BeforeAll

public static void setUp()? {

? ? ? ? System.setProperty(

"webdriver.chrome.driver",

"/driver/chrome95/chromedriver"

? ? ? ? );

? ? ? ? driver = new ChromeDriver();

? ? ? ? driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);

? ? }

@AfterAll

public static void tearDown()? {

? ? ? ? driver.quit();

? ? }


@Test

public void waitTest(){

? ? ? ? driver.get("https://ceshiren.com/");

? ? ? ? By locator = By.linkText("開源項目");

// 加入顯式等待

? ? ? ? WebDriverWait wait = new WebDriverWait(driver, 10);

? ? ? ? wait.until(ExpectedConditions.elementToBeClickable(locator));

// 點擊開源項目

? ? ? ? driver.findElement(locator).click();

? ? }

}

import org.junit.jupiter.api.AfterAll;

import org.junit.jupiter.api.BeforeAll;

import org.junit.jupiter.api.Test;

import org.openqa.selenium.By;

import org.openqa.selenium.chrome.ChromeDriver;

import org.openqa.selenium.support.ui.ExpectedConditions;

import org.openqa.selenium.support.ui.WebDriverWait;


import java.util.concurrent.TimeUnit;


public class WebDriverWaitTest {

private static ChromeDriver driver;

@BeforeAll

public static void setUp()? {

? ? ? ? System.setProperty(

"webdriver.chrome.driver",

"/driver/chrome95/chromedriver"

? ? ? ? );

? ? ? ? driver = new ChromeDriver();

? ? ? ? driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);

? ? }

@AfterAll

public static void tearDown()? {

? ? ? ? driver.quit();

? ? }


@Test

public void waitTest(){

? ? ? ? driver.get("https://ceshiren.com/");

? ? ? ? By locator = By.linkText("開源項目");

// 加入顯式等待

? ? ? ? WebDriverWait wait = new WebDriverWait(driver, 10);

? ? ? ? wait.until(ExpectedConditions.elementToBeClickable(locator));

// 點擊開源項目

? ? ? ? driver.findElement(locator).click();

? ? }

}

在實際工作中等待機制可以保證代碼的穩(wěn)定性,保證代碼不會受網速、電腦性能等條件的約束。


技術分享 | Web自動化之顯式等待與隱式等待的評論 (共 條)

分享到微博請遵守國家法律
静海县| 海淀区| 闽清县| 保山市| 漳浦县| 五莲县| 普定县| 美姑县| 凤山县| 民权县| 遂昌县| 铁力市| 桓仁| 民勤县| 弥渡县| 盐亭县| 牟定县| 祁连县| 长寿区| 仙游县| 唐海县| 忻城县| 兰溪市| 科技| 安化县| 凌源市| 吉隆县| 德安县| 屏东市| 瓮安县| 鄯善县| 贵溪市| 维西| 固始县| 扶沟县| 孟村| 新田县| 安康市| 门头沟区| 体育| 雅江县|