Selenium WebDriver对GWT的陈旧元素参考例外

时间:2014-12-23 19:39:59

标签: eclipse selenium selenium-webdriver cucumber-jvm

好的,我读了所有其他链接,我尝试了所提到的不同解决方案的变体,但是它们都不适用于我。

我的问题,我有以下代码:

package com.autotest.test.css;


import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.By;

import com.google.common.base.Predicate;

import java.util.concurrent.TimeUnit;

import cucumber.annotation.*;
import cucumber.annotation.en.*;
import static org.junit.Assert.assertEquals;


public class SaleStepsPre {

    private WebDriver driver;
    private String baseUrl;


    @Before
    public void setUp() {
    System.setProperty("webdriver.chrome.driver", "/Users/AppData/Local/Google/Chrome/Application/chromedriver.exe");   
    driver = new ChromeDriver();

    baseUrl = "http://xxxxx";
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    }

    @Given("^I navigate to the css application$")
    public void I_navigate_to_the_css_application() {
    driver.get(baseUrl + "/care/a#brochureware-home");
    }

    @When("^I select the prepaid catalog$")
    public void I_select_the_prepaid_catalog() {
    driver.findElement(By.xpath("//div[@id='brochureware-home']/div/div/div/div[2]/div[2]/div/div")).click();
    }

    @When("^I select the add to basket for product$")
    public void I_select_the_add_to_basket_for_product() {
    driver.findElement(By.xpath("//*[@id='salesItem']/div[1]/div[1]/div/div[5]/div[1]/button")).click();
    }

    @When("^then I Click on the basket icon to go to basket$")
    public void then_I_Click_on_the_basket_icon_to_go_to_basket()  {
        // times out after 5 seconds
        // while the following loop runs, the DOM changes - 
        // page is refreshed, or element is removed and re-added
        //driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
        //WebElement searchBox;
        //searchBox = driver.findElement(By.xpath("//input[@type='text']"));
    //driver.findElement(By.xpath("html/body/div[2]/div[1]/nav/div[1]/div[3]/div[2]/div/ul[1]/li[5]/a/img")).click();
    driver.findElement(By.cssSelector("c-menuimage")).click();
    }

    //@When("^then I click on the checkout button$")
    //public void then_I_click_on_the_checkout_button() {
    //driver.findElement(By.xpath("(//button[@type='button'])[9]")).click();
    //}


    @Then("^show product y$")
    public void show_product_y()  {

}


}

但是我收到以下错误:

For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
      B
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html

这是购物篮图标的css路径,位于菜单上。

body > div:nth-child(3) > div:nth-child(1) > nav > div.container-fluid.c-wide > div.c-kill > div.collapse.navbar-collapse.c-2ndmenu > div > ul.nav.navbar-nav.navbar-left > li:nth-child(5) > a > img

网站是GWT,步骤如下: 1.单击项目添加到购物篮 2.加入购物篮 3.点击篮子进入篮子。

但是我似乎无法做到这一点。

1 个答案:

答案 0 :(得分:1)

我遇到了问题,隐式等待仅适用于实际页面重新加载,当页面被动态重新加载(如ajax)时,这将失败。

您可以尝试等待项目的预期条件,它们很好用且易于使用且功能强大。您可以将它们配置为忽略某些异常, 所以你可以尝试在给定时间内找到一个元素然后失败。这甚至可以使用ajax

在我的情况下,我有一个小方法(它忽略了NoSuchElement异常):

protected <T> T waitForPageToLoad(ExpectedCondition<T> condition,   String errorMessage) {   
    Wait<WebDriver> wait = new FluentWait<WebDriver>(driver).withTimeout(MAX_WAITING_TIME, SECONDS).ignoring(StaleElementReferenceException.class).ignoring(NoSuchElementException.class).pollingEvery(100, MILLISECONDS).withMessage(errorMessage);
    T result = wait.until(condition);
    return result;
}

MAX_WAITING_TIME是此方法抛出异常的时间

然后你可以使用这个预期的条件:

public static final ExpectedCondition<Boolean> WAIT_FOR_BASKET = ExpectedConditions.visibilityOfElementLocated(By.cssSelector("c-menuimage"));

我在实用程序类中有很多它们,所以它们是静态的。你可以像你想要的那样做。

完整用法如下:

WebElement elem = waitForPageToLoad(waitForPageToLoad); 
elem.click();

这个解决方案起源于堆栈溢出,但我找不到原始的问题/答案,所以对发布此帖的真正的人感到荣幸