簡體   English   中英

如何在java中為Selenium webdriver編寫自己的自定義定位器?

[英]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類並為findElementfindElements方法提供實現,因為這是實際元素查找的'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.

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