我知道您无法在中初始化Select
对象PageFactory
。我一直在互联网上搜索,但只找到了一个可能的答案,可以使用ElementLocatorFactory
但在实现方面没有太多细节。我要问他们是成功实施它还是有实现它的想法的人,可以通过以外的其他方式来确定ElementLocatorFactory
。
目前,我仅使用以下内容:
@FindBy(how = How.ID, using = "select-log-status")
public WebElement __logStatus;
public Select selectLogStatus() {
return new Select(__logStatus);
}
我正在寻找实现的东西是这样的。
@FindSelectBy(how = How.ID, using = "select-log-status")
public Select selectLogStatus;
PS。我是selenium的新手,也是回来的Java开发人员,所以请好好对待我:)
由于没有人分享某些东西,因此我将分享我的做法。
我查看了一下代码,发现它的对象类型正在使用DefaultFieldDecorator
的decorate
方法进行过滤,因此我所做的只是创建了一个自定义FieldDecorator并扩展了DefaultFieldDecorator
该类,因为我只想覆盖decorate
。
所以,我有一个PageObject类 MyPageObjects
public class MyPageObjects {
protected final WebDriver driver;
public MyPageObjects (WebDriver driver) {
this.driver = driver;
}
@FindBy(id = "my-select-object")
public Select mySelectObj;
}
我的CustomFieldDecorator将包含以下替代方法:
@Override
public Object decorate(ClassLoader loader, Field field) {
if (!(WebElement.class.isAssignableFrom(field.getType())
|| Select.class.isAssignableFrom(field.getType())
|| List.class.isAssignableFrom(field.getType())
|| isDecoratableList(field))) {
return null;
}
ElementLocator locator = factory.createLocator(field);
if (locator == null) {
return null;
}
if (WebElement.class.isAssignableFrom(field.getType())) {
return proxyForLocator(loader, locator);
} else if (List.class.isAssignableFrom(field.getType())) {
return proxyForListLocator(loader, locator);
} else if (Select.class.isAssignableFrom(field.getType())) {
return new Select(locator.findElement());
} else {
return null;
}
}
注意以下几行:
|| Select.class.isAssignableFrom(field.getType())
和
} else if (Select.class.isAssignableFrom(field.getType())) {
return new Select(locator.findElement());
我会像这样初始化元素…
MyPageObjects page = new MyPageObjects(driver);
PageFactory.initElements(new CustomFieldDecorator(
new DefaultElementLocatorFactory(driver), page);
并照常访问Select对象…
page.mySelectObj.selectByVisibleText("hello world");
警告 :这没有用Proxy
,所以要小心。并且WebElement
包装的Select类被缓存。
更新:
我为创建了代理处理程序Select
。我创建了一个扩展类Select
和一个包含Select
的方法的接口。
CustomSelect.java
public class CustomSelect extends Select implements SelectInput {
public CustomSelect(WebElement element) {
super(element);
}
}
SelectInput.java
-接口
public interface SelectInput {
boolean isMultiple();
List<WebElement> getOptions();
List<WebElement> getAllSelectedOptions();
WebElement getFirstSelectedOption();
void selectByVisibleText(String text);
void selectByIndex(int index);
void selectByValue(String value);
void deselectAll();
void deselectByValue(String value);
void deselectByIndex(int index);
void deselectByVisibleText(String text);
}
SelectElementHanlder.java
-InvocationHandler
public class SelectElementWrapperHandler implements InvocationHandler {
private final ElementLocator locator;
public SelectElementWrapperHandler(ElementLocator locator) {
this.locator = locator;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
CustomSelect element;
try {
element = new CustomSelect(locator.findElement());
} catch (Exception e) {
if ("toString".equals(method.getName())) {
return "Proxy select(element) for: " + locator.toString();
}
else throw e;
}
try {
return method.invoke(element, args);
} catch (InvocationTargetException e) {
throw e.getCause();
}
}
}
在CustomFieldDecorator中创建了一个方法
protected SelectInput proxySelectForLocator(ClassLoader loader, ElementLocator locator) {
InvocationHandler handler = new SelectElementWrapperHandler(locator);
SelectInput proxy;
proxy = (SelectInput) Proxy.newProxyInstance(
loader, new Class[]{SelectInput.class}, handler);
return proxy;
}
然后从CustomFieldDecorator更改此行
} else if (Select.class.isAssignableFrom(field.getType())) {
return new Select(locator.findElement());
对此:
} else if (SelectInput.class.isAssignableFrom(field.getType())) {
return proxySelectForLocator(loader, locator);
现在,我将在PageObject类中声明选择对象,例如:
@FindBy(xpath = "some..xpath")
public SelectInput ticketStatus;
希望能帮助到你。如果有更正,请修改:)
问题内容: 我试图在选择元素中选择一个值。我正在使用Selenium RC(Java)运行测试用例。我了解选择值的代码由以下代码给出: 我无法使用上面的代码选择所需的值。我认为这可能与选择源代码中的optgroup有关。我没有任何异常,该命令执行得很好,但是在页面上未选择所需的值。另外,我不能使用ID(而不是值),因为那里没有任何ID。这是选择器的源代码: 有什么方法可以使用Selenium选择所
问题内容: 现在,我的脚本转到页面,并在出现错误消息之前,从下拉列表“ Vijesti”中打开第二个对象。 这是错误: StaleElementReferenceException:消息:在缓存中找不到元素-自查找页面以来,页面可能已更改 从selenium站点: 当对元素的引用现在“陈旧”时抛出。陈旧意味着元素不再出现在页面的DOM上。StaleElementReferenceException
以下是我得到的例外情况: 失败:goToPortal java.lang.nullPointerException(位于org.openqa.selenium.support.pageFactor.defaultelementLocator.findElement(defaultelementLocator.java:69)(位于org.openqa.selenium.support.pageFa
问题内容: 目前,我正在使用此: 它将我重定向到选项值内的位置。但这不能按预期工作。..这意味着如果我单击select的第一个选项,则onChange操作不会运行。我正在考虑使用javascript,但我想您会收到一些更好的建议。因此,如果我单击每个选项将其重定向到它的值,该如何使其起作用? 问题答案: 因为已经选择了第一个选项,所以永远不会触发change事件。添加一个空值作为第一个值,并检查位
问题内容: 问题: 无法从CSS选择器特定元素中选择。需要验证注册用户是否可以成功更改其密码。我试过了类的不同属性来调用它。当尝试前两个示例时,结果是方法中的异常错误。最后的尝试将调用第一个类实例并重置密码字段(失败)。 尝试过: 目的: 我需要选择共享同一班级的项目。如下所示,该类是共享的。 问题答案: 编辑:因为选择器需要一个,或,但是它们本身都不是。 提供要匹配的类名,并从那里指定要选择的特
用于选择对象的选项 在可以修改某个对象之前,需要将其与周围的对象区分开来。只需选择对象,即可加以区分。只要选择了对象或者对象的一部分,即可对其进行编辑。 Illustrator 提供以下选择方法和工具: 隔离模式可让您快速将一个图层、子图层、路径或一组对象与文档中的其他所有图稿隔离开来。在隔离模式下,文档中所有未隔离的对象都会变暗,并且不可对其进行选择或编辑。 图层面板可让您快速而准确地选择单个或