最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java+Selenium設(shè)置元素等待的方法詳解

 更新時間:2023年01月09日 09:01:54   作者:洛陽泰山  
本文主要介紹如何使用java代碼利用Selenium操作瀏覽器,某些網(wǎng)頁元素加載慢,如何操作元素就會把找不到元素的異常,此時需要設(shè)置元素等待,等待元素加載完,再操作,感興趣的可以了解一下

簡介

本文主要介紹如何使用java代碼利用Selenium操作瀏覽器,某些網(wǎng)頁元素加載慢,如何操作元素就會把找不到元素的異常,此時需要設(shè)置元素等待,等待元素加載完,再操作。

設(shè)置元素等待

很多頁面都使用 ajax 技術(shù),頁面的元素不是同時被加載出來的,為了防止定位這些尚在加載的元素報錯,可以設(shè)置元素等來增加腳本的穩(wěn)定性。webdriver 中的等待分為 顯式等待 和 隱式等待。

顯式等待

顯式等待:設(shè)置一個超時時間,每個一段時間就去檢測一次該元素是否存在,如果存在則執(zhí)行后續(xù)內(nèi)容,如果超過最大時間(超時時間)則拋出超時異常(TimeoutException)。顯示等待需要使用 WebDriverWait,同時配合 until 或 not until 。下面詳細講解一下。

import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
 
 
/**
 * @author Lenovo
 */
public class SeleniumDemo {
    private final static String webDriver = "webdriver.chrome.driver";
    private final static String webDriverPath ="E:\\chromedriver\\chromedriver.exe";
 
    public static void main(String[] args) throws InterruptedException {
        System.setProperty(webDriver, webDriverPath);
        WebDriver driver= new ChromeDriver();
        //博客主頁
        driver.get("https://blog.csdn.net/weixin_40986713");
        WebElement element=driver.findElement(By.className("submit"));
        long start=System.currentTimeMillis();
        //等待5秒
        WebDriverWait shortWait = new WebDriverWait(driver, 5);
        //5秒內(nèi)元素加載出來就執(zhí)行點擊
        shortWait.until(ExpectedConditions.elementToBeClickable(element)).click();
        //忽略找不到元素異常
        shortWait.ignoring(NoSuchElementException.class);
        System.out.println("耗時 "+(System.currentTimeMillis()-start)+" ms");
    }
}
  • until 指定預(yù)期條件的判斷方法,在等待期間,每隔一段時間調(diào)用該方法,判斷元素是否存在,直到元素出現(xiàn)。
  • ignoring 指定忽略的異常,如果設(shè)定的執(zhí)行等待超時的時間段內(nèi),忽略指定的異常,讓程序繼續(xù)進行。

隱式等待

隱式等待也是指定一個超時時間,如果超出這個時間指定元素還沒有被加載出來,就會拋出 NoSuchElementException 異常。

除了拋出的異常不同外,還有一點,隱式等待是全局性的,即運行過程中,如果元素可以定位到,它不會影響代碼運行,但如果定位不到,則它會以輪詢的方式不斷地訪問元素直到元素被找到,若超過指定時間,則拋出異常。

使用 driver.manage().timeouts().implicitlyWait() 來實現(xiàn)隱式等待,使用難度相對于顯式等待要簡單很多。

示例:打開個人主頁,設(shè)置一個隱式等待時間 5s,通過 id 定位一個不存在的元素,最后打印 拋出的異常 與 運行時間。

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
 
import java.util.concurrent.TimeUnit;
 
/**
 * @author Lenovo
 */
public class SeleniumDemo {
    private final static String webDriver = "webdriver.chrome.driver";
    private final static String webDriverPath ="E:\\chromedriver\\chromedriver.exe";
 
    public static void main(String[] args) throws InterruptedException {
        System.setProperty(webDriver, webDriverPath);
        WebDriver driver= new ChromeDriver();
        //博客主頁
        driver.get("https://blog.csdn.net/weixin_40986713");
        //設(shè)置全局隱式等待
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        long start=System.currentTimeMillis();
        try {
            driver.findElement(By.className("tarzan"));
        }catch (Exception e){
            System.out.println(e);
            System.out.println("耗時 "+(System.currentTimeMillis()-start)+" ms");
        }
    }
}

代碼運行到 driver.findElement(By.className("tarzan"));這句之后觸發(fā)隱式等待,在輪詢檢查 5s 后仍然沒有定位到元素,拋出異常。

強制等待

用java代碼強制當(dāng)前正在執(zhí)行的線程休眠(暫停執(zhí)行)

使用 time.sleep() 強制等待,設(shè)置固定的休眠時間,對于代碼的運行效率會有影響。

以上面的例子作為參照,將 隱式等待 改為 強制等待。

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
 
 
/**
 * @author Lenovo
 */
public class SeleniumDemo {
    private final static String webDriver = "webdriver.chrome.driver";
    private final static String webDriverPath ="E:\\chromedriver\\chromedriver.exe";
 
    public static void main(String[] args) throws InterruptedException {
        System.setProperty(webDriver, webDriverPath);
        WebDriver driver= new ChromeDriver();
        //博客主頁
        driver.get("https://blog.csdn.net/weixin_40986713");
        long start=System.currentTimeMillis();
        //等待5s
        Thread.sleep(5000);
        try {
            driver.findElement(By.className("tarzan"));
        }catch (Exception e){
            System.out.println(e);
            System.out.println("耗時 "+(System.currentTimeMillis()-start)+" ms");
        }
    }
}

值得一提的是,對于定位不到元素的時候,從耗時方面隱式等待和強制等待沒什么區(qū)別。但如果元素經(jīng)過 2s 后被加載出來,這時隱式等待就會繼續(xù)執(zhí)行下面的代碼,但 sleep還要繼續(xù)等待 3s。

總結(jié)

推薦使用的隱式等待,也就是implicitlyWait。

理由:

使用implicitlyWait或者明確等待(explicitly wait),方法參數(shù)是等待的最大時長。

也就是只要一找到元素,就會立刻執(zhí)行下一行代碼,不會強制等待參數(shù)里設(shè)置的時間。

而第三種(線程休眠)則不同,會強制等待設(shè)置的時間。設(shè)想一下,如果你的工程有好幾百個case,

需要等待的元素都采用第三種,會大大加長所有case執(zhí)行的時間,而你又急著要report,豈不是很慘。

使用implicitlyWait,webdriver會自動應(yīng)用到case中的所有element中。在啟動瀏覽器(driver.get)之后設(shè)置上,這樣就不用針對某個元素去設(shè)置了,簡直太方便了,不過有些特殊的元素,確實等待時間較長的,可以再采用explicit wait。

如果implicitlyWait和explicitly wait都在用在代碼里,那么最大等待時間不是兩個時間的疊加,而是取最大值。

到此這篇關(guān)于Java+Selenium設(shè)置元素等待的方法詳解的文章就介紹到這了,更多相關(guān)Java Selenium設(shè)置元素等待內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot配置mybatis駝峰命名規(guī)則自動轉(zhuǎn)換的實現(xiàn)

    SpringBoot配置mybatis駝峰命名規(guī)則自動轉(zhuǎn)換的實現(xiàn)

    這篇文章主要介紹了SpringBoot配置mybatis駝峰命名規(guī)則自動轉(zhuǎn)換的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 使用IDEA開發(fā)配置Java Web的初始化過程

    使用IDEA開發(fā)配置Java Web的初始化過程

    該教程使用idea開發(fā)工具初始化javaweb項目,該運行在tomcat服務(wù)器上通過配置項目環(huán)境變量保證tomcat正常啟動,具體操作配置教程參考下本文
    2021-06-06
  • Java中Controller引起的Ambiguous?mapping問題及解決

    Java中Controller引起的Ambiguous?mapping問題及解決

    這篇文章主要介紹了Java中Controller引起的Ambiguous?mapping問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Java使用pulsar-flink-connector讀取pulsar catalog元數(shù)據(jù)代碼剖析

    Java使用pulsar-flink-connector讀取pulsar catalog元數(shù)據(jù)代碼剖析

    這篇文章主要介紹了Java使用pulsar-flink-connector讀取pulsar catalog元數(shù)據(jù)代碼剖析,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • Spring Security基于json登錄實現(xiàn)過程詳解

    Spring Security基于json登錄實現(xiàn)過程詳解

    這篇文章主要介紹了Spring Security基于json登錄實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • java返回前端樹形結(jié)構(gòu)數(shù)據(jù)的2種實現(xiàn)方式

    java返回前端樹形結(jié)構(gòu)數(shù)據(jù)的2種實現(xiàn)方式

    近期項目有個需求,需要將組織機構(gòu)數(shù)據(jù)拼成樹型結(jié)構(gòu)返回至前端,下面這篇文章主要給大家介紹了關(guān)于java返回前端樹形結(jié)構(gòu)數(shù)據(jù)的2種實現(xiàn)方式,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-05-05
  • 詳解Quartz 與 Spring框架集成的三種方式

    詳解Quartz 與 Spring框架集成的三種方式

    這篇文章主要介紹了詳解Quartz 與 Spring框架集成的三種方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • 詳解Javaweb狀態(tài)管理的Session和Cookie

    詳解Javaweb狀態(tài)管理的Session和Cookie

    這篇文章主要介紹了Javaweb狀態(tài)管理的Session和Cookie,將瀏覽器與web服務(wù)器之間多次交互當(dāng)做一個整體來處理,并且多次交互所涉及的數(shù)據(jù)(狀態(tài))保存下來,需要的朋友可以參考下
    2023-05-05
  • 使用spring mail發(fā)送html郵件的示例代碼

    使用spring mail發(fā)送html郵件的示例代碼

    本篇文章主要介紹了使用spring mail發(fā)送html郵件的示例代碼,這里整理了詳細的示例代碼,具有一定的參考價值,有興趣的可以了解一下
    2017-09-09
  • Java自定義equals產(chǎn)生的問題分析

    Java自定義equals產(chǎn)生的問題分析

    這篇文章主要介紹了Java自定義equals時super.equals帶來的問題分析,總的來說這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過程。希望通過這道題能給你帶來一種解題優(yōu)化的思路
    2023-01-01

最新評論

密云县| 延吉市| 游戏| 布拖县| 宝应县| 彭泽县| 华容县| 衡山县| 星座| 新宁县| 积石山| 芷江| 西乡县| 湛江市| 曲麻莱县| 武强县| 卢湾区| 昭觉县| 蓬安县| 中卫市| 南开区| 扎鲁特旗| 白朗县| 阜平县| 平乡县| 万荣县| 文安县| 特克斯县| 衡阳县| 恩施市| 安仁县| 奉化市| 夏邑县| 西和县| 板桥市| 琼海市| 来安县| 安吉县| 区。| 南漳县| 大连市|