可以覆盖@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;
虽然这样做了,但我不得不更改所有测试页面(这是我想避免的),但它不会改变其他网站的其他测试的工作方式,这是关键!
我正在移植一个现有项目,我有一个名为 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;
虽然这样做了,但我不得不更改所有测试页面(这是我想避免的),但它不会改变其他网站的其他测试的工作方式,这是关键!