[英]How to write my own customize locator for Selenium webdriver in java?
我想編寫自己的定位器來訪問元素。 WebDriver的API提供了八個定位器,允許通過id,name屬性,標簽名稱,完整或部分鏈接文本,XPath,類名和css選擇器來檢索元素。 但是現在這些默認定位器對我來說還不夠,因為我必須通過新屬性訪問元素。 讓我舉幾個例子,這樣你就可以理解我真正想要的東西了。
示例: 選擇您的用戶名:
現在我想寫一個代碼,以便我可以使用myLocator定位器訪問用戶名按鈕,如:
*driver.findElement(By.myLocator("username")).*
如果有人能給我們一些好主意,我怎么能重寫BY類來添加我自己的定位器,這將是非常有幫助的。
預先感謝您的幫助。
使用c#
using OpenQA.Selenium;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
public class ImageBy : By
{
public ImageBy(string imageByString)
{
FindElementMethod = (ISearchContext context) =>
{
IWebElement mockElement = context.FindElement(By.XPath("//img[@src='" + imageByString + "']"));
return mockElement;
};
FindElementsMethod = (ISearchContext context) =>
{
ReadOnlyCollection<IWebElement> mockElements = context.FindElements(By.XPath("//img[@src='" + imageByString + "']"));
return mockElements;
};
}
}
用法如下
[FindsBy(How = How.Custom, Using = @"/path/to/img", CustomFinderType = typeof(ImageBy) )]
private IWebElement MenuStartButton = null;
使用Java
import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.SearchContext;
import org.openqa.selenium.WebElement;
public class ByImageSrc extends By
{
private final String imageByString;
public ByImageSrc(String imageByString)
{
this.imageByString = imageByString;
}
@Override
public List<WebElement> findElements(SearchContext context)
{
List<WebElement> mockElements = context.findElements(By.xpath("//img[@src='" + imageByString + "']"));
return mockElements;
}
}
用法:
WebElement element = driver.findElement(new ByImageSrc("/path/to/image"));
您需要findElement
By
類並為findElement
和findElements
方法提供實現,因為這是實際元素查找的'meat'發生的地方。
然后,您應該能夠將其與普通的driver.FindElement
一起使用。
我知道這並沒有真正回答你的問題,但為什么不只是使用Xpath? 看起來構建一個新的定位器而不是僅僅抓取DOM會有很多額外的工作。
例如: driver.findElement(By.Xpath("//div[@username='YourUsername']")
我可以提供一個更好的示例,其中包含有關您正在使用的屬性和頁面的更多詳細信息。
就像Michiel回答的那樣,我覺得你可以用Selenium已經提供的東西達到你想要的效果。 如果這是一個維護開銷,您希望避免由於開發人員更改ID和元素名稱,您可以創建一個單獨的文件來跟蹤您需要定位的元素。
//EG. (not Java I know :))
string usernameXPath = "//div[@username='YourUsername']";
然后,如果有變化,你可以保持這個。 您甚至可以更進一步為每個“其他類型”的元素實現一個類,只需在構造函數中放置一個XPath。 XPath非常靈活,因為它提供了諸如' contains '和' parent :: div'之類的功能 。 也許請查看W3schools頁面以獲取更多XPath閱讀。
編輯:另外值得注意的是,C#綁定最新版本說明如下:
.Net:介紹將CustomFinderType屬性更新到.NET FindsByAttribute。 這允許在PageFactory中使用自定義By子類。 自定義查找程序必須是By的子類,並且它必須公開帶有字符串參數的公共構造函數。
Hopefull這也是你下一個Java版本:)
你可以這樣做:
private final String myLocator = "//*[contains(@id,'username') and contains (@type,'text') and contains (text(),'exactly what I want')]";
因此,您可以根據需要編寫定位器,具體取決於您要映射的屬性,單擊或選擇不需要5行。
此外,您可以在該定位器中使用通配符,只需用“%s”替換您要用作參數的任何內容,如下所示:
private final String myLocator = "//*[contains(@id,'%s') and contains (@type,'text') and contains (text(),'exactly what I want')]";
然后有一個動態元素,如下所示:
private WebElement usernameSelectElement(String text) {
return driver.findElement(By.xpath(String.format(myLocator, text)));
}
用法如下:
public void clickMyElement(text){
usernameSelectElement(text).click();
}
對於你所擁有的例子,在我看來它過於復雜了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.