日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

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

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

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

  • 隱式等待
  • 顯式等待
  • 強制等待

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

隱式等待

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

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

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

  • Python/ target=_blank class=infotextkey>Python 版本
self.driver.implicitly_wait(30)
  • JAVA 版本
//隱式等待調用方式,設置等待時間為5秒
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

顯式等待

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

  • 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 庫并不能滿足所有場景,這個時候就需要定制化開發來滿足特定場景。

  • 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")));
...

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

實戰演練

def ceshiren():
# 定義一個方法
def wait_ele_for(driver):
# 將找到的元素個數賦值給 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(){
// 將找到的元素個數賦值給 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)

實戰演示

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

 

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

#導入依賴
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();
    }
}

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

分享到:
標簽:自動化 Web
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定