好的,我读了所有其他链接,我尝试了所提到的不同解决方案的变体,但是它们都不适用于我。
我的问题,我有以下代码:
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.点击篮子进入篮子。
但是我似乎无法做到这一点。
答案 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();
这个解决方案起源于堆栈溢出,但我找不到原始的问题/答案,所以对发布此帖的真正的人感到荣幸