如何等待元素处于可选状态?Page Factory中使用Wait遇报错求助
解决Page Factory中使用Wait等待Select元素的问题
嘿,我明白你遇到的问题了——咱们先拆解下代码里的问题出在哪:
你的Page Factory代码本身是没问题的:
@FindBy(xpath="//select[@ng-model='selectedLeadSource']") WebElement source_of_lead; public Select getSourceOptions() { return new Select(source_of_lead); }
但你调用等待的代码犯了参数类型不匹配的错误:
wait.until(ExpectedConditions.elementToBeClickable(onPage.getSourceOptions().selectByValue("Campaign")));
核心问题很直接:selectByValue("Campaign")是Select类的方法,它的返回值是void(没有返回内容),但elementToBeClickable()需要的参数是By对象或者WebElement,两者完全不兼容,所以才会抛出那个类型不匹配的报错。
给你两个可行的解决方案:
方案1:先等待下拉框元素可点击,再执行选择
把等待和选择操作拆成两步,先确保元素处于可交互状态,再进行选值操作:
// 先等待下拉框本身可点击 wait.until(ExpectedConditions.elementToBeClickable(onPage.source_of_lead)); // 再调用选择方法 onPage.getSourceOptions().selectByValue("Campaign");
如果把source_of_lead设为私有变量(更符合封装原则),可以在Page类里加一个获取该元素的方法:
@FindBy(xpath="//select[@ng-model='selectedLeadSource']") private WebElement source_of_lead; // 新增获取WebElement的方法 public WebElement getSourceElement() { return source_of_lead; } public Select getSourceOptions() { return new Select(source_of_lead); }
调用时改成:
wait.until(ExpectedConditions.elementToBeClickable(onPage.getSourceElement())); onPage.getSourceOptions().selectByValue("Campaign");
方案2:直接等待目标选项可被选择
如果你想更精准地等待特定选项出现并可交互,可以直接定位该选项元素:
// 等待"Campaign"选项可点击 wait.until(ExpectedConditions.elementToBeClickable( By.xpath("//select[@ng-model='selectedLeadSource']/option[@value='Campaign']") )); // 再执行选择操作 onPage.getSourceOptions().selectByValue("Campaign");
再补一句为啥原来的写法不行
ExpectedConditions.elementToBeClickable()的设计目标是等待某个元素进入可点击状态,它必须接收元素定位器(By)或者已找到的WebElement。而你直接把selectByValue()的返回结果(void)传进去,相当于给方法塞了一个完全不匹配的参数,编译器自然会报错啦。
内容的提问来源于stack exchange,提问作者Cod
相关产品推荐
相关产品推荐

