可以覆盖@FindBy的超类

时间:2016-01-08 17:11:27

标签: java selenium superclass

我移植了一个现有的项目,我有一个名为DetailPage的超类,这是我唯一可以更改/编辑的东西。这是一个硒测试项目,在以前的版本中,我有数百个单独的页面扩展DetailPage并且有以下几行:

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

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

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

是我现在想要的。

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

已编辑的代码示例:

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);
        }
    }
}

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