簡體   English   中英

定位元素selenium + java的最快方法

[英]fastest way to locate elements selenium+java

在測試期間,我需要檢查我的網站上是否有無效的工具提示和其他錯誤消息,以確保一切正常。 問題是硒似乎要花很長時間才能找到這些元素,並且它們被設置在計時器上,因此它們有時有時間在硒找到它們之前消失,我們正在談論一個3秒的計時器。

現在我發現它們是這樣的:

      List<WebElement> error = driver.findElements(By.cssSelector("div.alert .error"));
        if (error.size() == 0) {return true;}
        else {return false;}

這將查找給定時間在網站上顯示的所有錯誤消息,有時這會導致跟上進度。 工具提示是使用javascript創建和銷毀的,因此不會隱藏然后顯示。 有什么想法嗎?

編輯:

由於該網站是單頁頁面,因此找到合適的頁面要花費大量的元素,但是當我尋找一個實際可見的項目時它很快,因此可以最大程度地減少搜索量,我這樣做是:

WebElement messages = driver.findElement(By.id("the-div-the-message-is-created-in"));
List<WebElement> error = messages.findElements(By.cssSelector("div.alert .error"));
if (error.size() == 0) {return true;}
else {return false;}

盡管它似乎並沒有更快地驗證元素的存在。

我在我建立的每個框架中都放了一些東西,這非常有效。.這是從此處找到的框架的摘錄。 您可以在這里下載 ...

在對對象執行任何操作之前,我先實現了一種偽等待類型的方法。 自己嘗試。 非常有效。

這些是AutomationTest類的方法

    /**
     * Checks if the element is present or not.<br>
     * @param by
     * @return <i>this method is not meant to be used fluently.</i><br><br.
     * Returns <code>true</code> if the element is present. and <code>false</code> if it's not.
     */
    public boolean isPresent(By by) {
        if (driver.findElements(by).size() > 0) return true;
        return false;
    }

    /**
     * Private method that acts as an arbiter of implicit timeouts of sorts.. sort of like a Wait For Ajax method.
     */
    private WebElement waitForElement(By by) {
        int attempts = 0;
        int size = driver.findElements(by).size();

        while (size == 0) {
            size = driver.findElements(by).size();
            if (attempts == MAX_ATTEMPTS) fail(String.format("Could not find %s after %d seconds",
                                                             by.toString(),
                                                             MAX_ATTEMPTS));
            attempts++;
            try {
                Thread.sleep(1000); // sleep for 1 second.
            } catch (Exception x) {
                fail("Failed due to an exception during Thread.sleep!");
                x.printStackTrace();
            }
        }

        if (size > 0) System.err.println("WARN: There are more than 1 " + by.toString() + " 's!");

        return driver.findElement(by);
    }

自己組合這些方法,就可以了。

在性能方面,我不能對您這么強調。. 使用CSS 它更快,更干凈。 你自己看。

考慮以下,

<div id="something">
  <div class="someClass">
    <a href='http://google.com/search?'>Search Google</a>
  </div>
</div>

讓我們找到<a>

CSS:

div#something div.someClass > a[href^='http://google']

XPATH:

//div[@id='something']/div[contains(@class, 'someClass')]/a[starts-with(@href, 'http://google')]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM