如何在Java中为Selenium Webdriver编写自己的自定义定位器?

Blu*_*Sky 4 java selenium webdriver browser-automation selenium-webdriver

我想编写自己的定位器来访问元素。WebDriver的API当前提供八个定位器,允许按ID,名称属性,标记名称,完整或部分链接文本,XPath,类名称和CSS选择器检索元素。但是,这些默认定位器现在对我来说还不够,因为我必须通过新属性来访问元素。让我举个例子,这样您就可以在这里了解我的真正需求。

示例: 选择您的用户名:

现在,我想编写一个代码,以便可以使用myLocator定位器访问用户名按钮,如下所示:

*driver.findElement(By.myLocator("username")).*
Run Code Online (Sandbox Code Playgroud)

如果有人可以给我们一些好主意,那我将如何重写BY类以添加自己的定位器,这将非常有帮助。

预先感谢您的帮助。

Sri*_*har 5

使用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;
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

用法如下

[FindsBy(How = How.Custom, Using = @"/path/to/img", CustomFinderType = typeof(ImageBy) )]
private IWebElement MenuStartButton = null;
Run Code Online (Sandbox Code Playgroud)

使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

WebElement element = driver.findElement(new ByImageSrc("/path/to/image"));
Run Code Online (Sandbox Code Playgroud)


Arr*_*ran 1

您需要对该类进行子类化并提供和方法By的实现,因为这是实际元素查找的“重点”所在。findElementfindElements

然后您应该能够正常使用它driver.FindElement