java - Java Selenium 错误“java.lang.IllegalArgumentException:参数属于非法类型:com.sun.proxy.$Proxy20”
问题描述
我在 PageObjects 类中有我想通过 Functions 类中的 JavascriptExecuter 单击的元素
页面对象类:
package com.objects;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.PageFactory;
public class PageObject {
protected WebDriver driver;
public PageObject(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(driver, this);
}
}
页面对象类:
package com.objects;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import java.util.List;
public class PageObjects extends PageObject{
public WebDriver driver;
@FindBy (xpath = "//label[@class='mat-checkbox-layout']")
public WebElement isRequiredCheckbox;
public PageObjects(WebDriver driver) {
super(driver);
}
}
函数类:
package com.functions;
import org.openqa.selenium.*;
import java.util.List;
public class Functions {
public WebDriver driver;
public WebElement jsClick(WebDriver driver, WebElement element){
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", element);
return element;
}
}
当我jsClick
在主类中调用方法时,它返回错误
functions.jsClick(driver, pageObjects.isRequiredCheckbox);
错误:
java.lang.IllegalArgumentException: Argument is of an illegal type: com.sun.proxy.$Proxy20
at org.openqa.selenium.remote.internal.WebElementToJsonConverter.apply(WebElementToJsonConverter.java:84)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
at org.openqa.selenium.remote.RemoteWebDriver.executeScript(RemoteWebDriver.java:477)
at com.functions.Functions.jsClick(Functions.java:52)
at com.testDefinition.MainTest.addNewNoun(MainTest.java:300)
但是如果我在主类中声明元素路径,它可以正常工作
WebElement isRequiredCheckbox = driver.findElement(By.xpath("//label[@class='mat-checkbox-layout']"));
functions.jsClick(driver, isRequiredCheckbox);
但我想使用 PageObjects 类中的元素路径
主类:
package com.testDefinition;
import com.data.UserData;
import com.functions.Functions;
import com.objects.PageObjects;
import io.cucumber.java.en.And;
import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import org.junit.Assert;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.util.List;
public class MainTest {
private PageObjects pageObjects;
private UserData userData;
private Functions functions = new Functions();
private final WebDriver driver = new FirefoxDriver();
private WebDriverWait wait = new WebDriverWait(driver, 20);
@Given("Open website")
public void runWebDriver() {
System.setProperty("webdriver.geckodriver.driver", "/usr/local/bin/geckodriver");
driver.get("website link");
driver.manage().window().maximize();
}
@Then("Login by Admin")
public void login() {
pageObjects = new PageObjects(driver);
userData = new UserData();
pageObjects.inputLogin.sendKeys(userData.Admin);
pageObjects.inputPassword.sendKeys(userData.AdminPass);
pageObjects.submitButton.click();
}
@And("Start add new noun")
public void addNewNoun() throws Throwable{
wait.until(ExpectedConditions.visibilityOf(pageObjects.addNewNounBtn));
List <WebElement> qaCodesList = pageObjects.nounQACodesList;
List <WebElement> preservCodesList = pageObjects.nounPreservCodesList;
List <WebElement> measuerUnitsList = pageObjects.measureUnitList;
String qaCodeText = "Test";
pageObjects.addNewNounBtn.click();
pageObjects.inputNounModifName.sendKeys(functions.generateNounModifName());
Thread.sleep(500);
pageObjects.nounQACodesListBtn.click();
Thread.sleep(500);
functions.getAddNounListCode(qaCodesList, qaCodeText);
pageObjects.nounPreservCodesListBtn.click();
Thread.sleep(500);
preservCodesList.get(2).click();
wait.until(ExpectedConditions.visibilityOf(pageObjects.addSpecificationBtn));
pageObjects.addSpecificationBtn.click();
pageObjects.specificationName.sendKeys(functions.generateNounModifName());
Thread.sleep(500);
pageObjects.measureUnitsListBtn.click();
wait.until(ExpectedConditions.visibilityOfAllElements(measuerUnitsList));
measuerUnitsList.get(3).click();
//WebElement isRequiredCheckbox = driver.findElement(By.xpath("//label[@class='mat-checkbox-layout']"));
functions.jsClick(driver, pageObjects.isRequiredCheckbox);
}
}
解决方案
请检查您的 PageObject 类是否正在初始化 PageFactory。如果 PageFactory 未初始化,您的 webelement 将为空。
public class PageObject
{
public PageObject(WebDriver driver){
PageFactory.initElements(driver, this);
}
}
推荐阅读
- regex - Fluentd 中的正则表达式字符串否定
- security - Spring Boot 2.0:如何禁用特定端点的安全性
- react-native - 如何获得反应原生动态滚动视图的实际高度
- ios - 如何在 uicollectionview 单元格下创建线条?(iOS)
- javascript - REGEX - 在分隔符之间取任何东西
- android - FragmentActivity 和 Fragment 之间如何通信?
- javascript - Javascript图表:如何隐藏数据
- serial-port - 即使在重新启动 Ubuntu 18.04 后,具有拨出组权限的非 root 用户的串行端口权限也会被拒绝
- scala - 从数据框制作 avro 模式 - spark - scala
- istio - Istio 服务入口不工作