首页 > 解决方案 > 使用 WebDriverWait 的 NoSuchElementException

问题描述

我真的很想了解为什么在以与以前失败完全相同的方式接近定位元素时。

NoSuchElementException :Caused by: org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//span[contains(text(),'Add')]"}

我也尝试过使用类似以下的东西,但它也失败了,所以为了让我编写一个好的自动化代码,我需要直接了解我的知识WebDriverWait,所以我很感激有知识的人花一些时间在这个调查上。

xpath如果我有这样的情况,它会定位:

//body/div[@id='root']/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/div[2]/div[1]/div[2]/div[1]/div[2]/div[1]

 public void clickOnAddVehicleButton() {
    wait.until(ExpectedConditions.visibilityOf(addVehicleButton));
    vehicles.addVehicleButton.click();
}

我不是 Java 新手,但我是自动化新手,因此缺少一些知识领域,我哈

基类:

    public class BasePage {

    protected final WebDriver driver;
    protected final WebDriverWait wait;

    public BasePage(WebDriver driver) {
        this.driver = driver;
        this.wait = new WebDriverWait(driver,5);
        PageFactory.initElements(new AjaxElementLocatorFactory(driver, 10), this);
    }
}

该按钮应该存在的组件:

public class Vehicles extends BasePage {

private static Vehicles vehicles;

private Vehicles(WebDriver driver) {
    super(driver);
}

@FindBy(xpath = "//span[text(),'Add']")
public WebElement addVehicleButton;

public static Vehicles vehiclesInstance(WebDriver driver) {
    return vehicles == null ? vehicles = new Vehicles(driver) : vehicles;
}

public void clickOnAddVehicleButton() {
    vehicles.addVehicleButton.click();
}

服务类中的功能:

public void addVehicle(String vehicleName, String numberPlate) {
    myAccountService.myAccountPage()
            .clickOnVehiclesTab();
    vehicles.fillInVehicleName(vehicleName)
            .fillInVehicleNumberPlate(numberPlate)
            .clickOnAddVehicleButton();
}

用于测试的 WebDriverSettings :

public class WebDriverSettings {

protected WebDriver driver;

@Before
public void setUp() {
    WebDriverManager.chromedriver().setup();
    driver = new ChromeDriver();
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
    loginToDevEnvironment();
}

最后是我调用服务方法的测试类:

public class VehicleServiceTest extends WebDriverSettings {

private VehiclesService vehiclesService;

@Before
public void setUp(){
    super.setUp();
    CookieService.cookieServiceInstance(driver).acceptCookies();
    HomePageService.homePageServiceInstance(driver).clickOnMyAccountTab();
    LoginService.loginServiceInstance(driver).login(loginCorrectData());
    HomePageService.homePageServiceInstance(driver).clickOnMyAccount();
    vehiclesService = VehiclesService.vehiclesServiceInstance(driver);
}

@Test
public void shouldAddVehicle(){
    vehiclesService.addVehicle("test-vehicle","test-test");
    Assert.assertEquals(1,vehiclesService.getVehicles().listOfAddedVehicles().size());
}

标签: javaseleniumwebdriverwait

解决方案


推荐阅读