可以覆盖@FindBy的超级class

Super class that can override @FindBy

我正在移植一个现有项目,我有一个名为 DetailPage 的超级 class,这是我唯一可以 change/edit 的东西。这是一个 selenium 测试项目,在以前的版本中,我有数百个扩展 DetailPage 并具有以下行的单独页面:

@FindBy(id="someID")
private WebElement someIDBox;

搜索给定 ID 的页面并将该元素分配给变量。我现在有一个类似的网站 nonW3C 所以我现在需要通过 name 找到而不是通过 id 找到,即:

@FindBy(name="someID")
private WebElement someIDBox;

就是我现在想要的。

所以我的问题是如何(如果可能的话)在 DetailPage 中创建一个超级 class 函数,它会注意到我说 id 并用 name 覆盖?

我不想要一个只用 name 替换单个页面中的文本 id 的函数,因为我需要保留这些内容。

article 的作者扩展了“FindBy”注释来支持他的需求。您可以使用它来覆盖 'FindBy' 并实现您的 on 实现。

编辑后的代码示例:

private static class CustomFindByAnnotations extends Annotations {

    protected By buildByFromLongFindBy(FindBy findBy) {
        How how = findBy.how();
        String using = findBy.using();

        switch (how) {
            case CLASS_NAME:
                return By.className(using);
            case ID:
                return By.id(using); // By.name(using); in your case
            case ID_OR_NAME:
                return new ByIdOrName(using);
            case LINK_TEXT:
                return By.linkText(using);
            case NAME:
                return By.name(using);
            case PARTIAL_LINK_TEXT:
                return By.partialLinkText(using);
            case TAG_NAME:
                return By.tagName(using);
            case XPATH:
                return By.xpath(using);
            default:
                throw new IllegalArgumentException("Cannot determine how to locate element " + field);
        }
    }
}

请注意我自己没有尝试过。希望对你有帮助。

这不符合我要求的标准,但感谢@guy,我被介绍给 ByIdOrName,这有助于解决我的问题。所以我做了一个小脚本,遍历了工作区中的所有文件并替换了

@FindBy(id="someID")
private WebElement someIDBox; 

@FindBy(how = How.ID_OR_NAME, using="someID")
private WebElement someIDBox;

虽然这样做了,但我不得不更改所有测试页面(这是我想避免的),但它不会改变其他网站的其他测试的工作方式,这是关键!