簡體   English   中英

使用 Selenium 的 POM 中 @By 和 @FindBy 之間的區別

[英]Difference between @By and @FindBy in POM using Selenium

在使用 Selenium 到頁面 Object Model 時,任何人都可以通過回答@By@Findby之間的區別來幫助我。

@FindBy 使用頁面工廠設計模式,By 用於定位元素(兩者相同但使用情況不同)

@FindBy(linkText ="REGISTER")
private WebElement register_menu_element;

在使用了這兩種方式之后,我可以說使用注解的主要優點是增加了代碼的可讀性並減少了維護工作!

在 PageFactory - 它唯一的 @FindBy 或 @FindBys finder 注釋實際上是一個接口。 沒有“@By”注釋,它只是 By 和-“By”是 selenium 中的抽象 class。

它們都用於形成 object 存儲庫,即獲取元素定位器。 兩者的使用取決於您的自動化框架的設計方式。 即,如果您使用過 PageFactory 模式,您將使用 @FindBy/s,對於非 pagefactory 框架,您可以使用 By 定位器方法

對於前-使用@FindBy-

@FindBy(xpath = "//button[contains(.,'Ok')]")
WebElement okBtn;

使用 By-

By okBtn = By.xpath("//button[contains(.,'Ok')]");

或者直接使用——

driver.findElement(By.xpath("//button[contains(.,'Ok')]")).click();

PageFactory中的 PageFactory 收集所有帶有@FindBy@FindBys@FindAll注釋的WebElement ,並By object 的注釋值構建,其中包含有關選擇器及其值的信息。

PageFactory還支持惰性實例化。 PageFactory僅在您嘗試與之交互時才嘗試查找該元素。

Class

Class By()是用於在文檔中定位元素的機制。 直接已知的子類是:

  • By.ByClassName
  • By.ByCssSelector
  • 按.ById
  • By.ByLinkText
  • 按姓名
  • By.ByPartialLinkText
  • By.ByTagName
  • By.ByXPath

您始終可以使用下面提到的 class 的子類創建自己的定位器策略,並根據需要覆蓋受保護的方法,因為預計所有子類都依賴於通過以下 static 方法提供的基本定位機制 static 方法:

public WebElement findElement(WebDriver driver) { 
    WebElement element = driver.findElement(By.id(getSelector())); 
    if (element == null) {
        element = driver.findElement(By.name(getSelector()); 
        return element; 
    }
}

注釋類型 FindBy

另一方面,注釋類型FindBy()用於標記頁面 Object上的字段,以指示用於定位元素或元素列表的替代機制。 FindBy()PageFactory結合使用,允許用戶快速輕松地創建PageObjects 您可以通過指定howusing或通過指定具有適當值使用的位置策略之一(例如: id )來使用此注釋。 這兩個選項都將委托給By class中的匹配 By 方法。

例如,這兩個注釋指向同一個元素:

  1. @FindBy(id = "foo") WebElement foo;
  2. @FindBy(how = How.ID, using = "foo") WebElement foo;

您可以在討論 如何使用 PageFactory 字段和 PageObject 模式的顯式等待中找到@Simon Stewart 對同一主題的評論


參考

您可以在以下位置找到一些相關的詳細討論:

暫無
暫無

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

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