【发布时间】:2019-12-05 10:34:18
【问题描述】:
我在 PageObjects 类中有我想通过 Functions 类中的 JavascriptExecuter 点击的元素
PageObject 类:
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);
}
}
PageObjects 类:
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);
}
}
【问题讨论】:
-
事情应该以特定的方式工作。在 PageObjects 类中创建一个 getter 方法,例如
Public WebElement getRequiredCheckbox() { return isRequiredCheckbox; }并将此元素作为参数传递给functions.jsClick(driver, new PageObjects(driver).getRequiredCheckbox());假设您正在以适当的方式进行 PageFactory 元素初始化。 -
@Nik 感谢您的回答,但它显示相同的错误:)
-
我会从所有提供的类中删除你所有的
driver字段,因为它们不参与逻辑。 -
您使用哪些版本的 FFx、FF 驱动程序和 Selenium 绑定?
-
@AlexeyR。火狐版本:69.0.2,壁虎驱动版本:0.26.0