如何将尝试捕获异常更改为WebDriverWait

时间:2016-08-01 10:20:45

标签: java selenium-webdriver

我正在尝试根据从日历中选择的日期登录和搜索记录。我在每一步之后都使用了try catch异常。我需要用WebDriverWait替换try catch。但问题是我在页面上有字段,这些字段由id或XPath识别。所以我没有找到如何实现WebDriverWait而不是try catch的方法。谁能帮我吗?下面是我的代码结构,包含详细信息。

public class Login {
    public static WebDriver driver;
    String username = "username";
    String password = "password";
    String baseurl = "http://mybusiness.com/login.aspx";


public class Details {  
    @Test(priority = 0)
    public void loginpage() {
        //WebDriver driver = new FirefoxDriver();
        System.setProperty("webdriver.chrome.driver","D:\\From H\\Selenium Package\\ChromeDriver\\chromedriver_win32\\chromedriver.exe");

        DesiredCapabilities capabilities = DesiredCapabilities.chrome();
        capabilities.setCapability("chrome.switches", Arrays.asList("--incognito"));
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--test-type");
        options.addArguments("--disable-extensions");
        capabilities.setCapability("chrome.binary","D:\\From H\\Selenium Package\\ChromeDriver\\chromedriver_win32\\chromedriver.exe");
        capabilities.setCapability(ChromeOptions.CAPABILITY, options);


        driver = new ChromeDriver(capabilities);
        driver.manage().deleteAllCookies();
        driver.manage().window().maximize();
        driver.get(baseurl);

        try {
            Thread.sleep(10000); // 1000 milliseconds is one second.
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
        }
        WebElement username = driver.findElement(By.id("UserName"));
        username.sendKeys(username);
        try {
            Thread.sleep(10000); // 1000 milliseconds is one second.
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
        }
        WebElement password = driver.findElement(By.id("Password"));
        password.sendKeys(password);
        try {
            Thread.sleep(10000);
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
        }
        WebElement button = driver.findElement(By.id("ButtonClick"));
        button.click();
        try {
            Thread.sleep(10000);
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
        }
    }

    // Selecting a date from date picker
    @Test(priority = 1)
    public void RecordSearch() {
        WebElement calendar = driver.findElement(By.id("CalendarId"));
        calendar.click();
        try {
            Thread.sleep(5000); // 1000 milliseconds is one second.
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
        }

        WebElement month = driver.findElement(By.xpath("XPath"));
        month.click();
        try {
            Thread.sleep(5000); // 1000 milliseconds is one second.
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
        }

        WebElement day = driver.findElement(By.xpath("XPath"));
        day.click();
        try {
            Thread.sleep(5000); // 1000 milliseconds is one second.
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
        }

        WebElement submit = driver.findElement(By.id("Submit"));
        submit.click();
        try {
            Thread.sleep(10000); // 1000 milliseconds is one second.
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
        }

    }

        driver.close();
}

4 个答案:

答案 0 :(得分:1)

我原本以为你最好不要添加隐含的等待,例如一旦您设置了驱动程序对象,请添加以下行:

driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);

答案 1 :(得分:0)

如果你探索的很少,你可以找到不同类型的WebDriverWait。其中最常见的是WebDriver.wait(timeinmilliseconds)

例如,其他人是,

webDriver.waituntil (Expectedconditions)...

wait.until(new ExpectedCondition<Boolean>() {
    @Override
    public Boolean apply(WebDriver driver) {
        WebElement button = driver.findElement(By.className("sel"));
        String enabled = button.getText();
        return enabled.contains(city);
    }
});

或者例如

wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.id("froexample_username_txtbox")));

PS:define private final WebDriverWait wait;

如果您不确定隐含时间等值,可能会更有用。(具体说明事件和结果)

答案 2 :(得分:0)

selenium中有WebDriverWait个功能,您可以设置显式等待。您使用的是selenium webdriver,然后使用WebDriverWait来等待元素更好。按照以下代码

protected WebElement waitForPresent(final String locator, long timeout) {
  WebDriverWait wait = new WebDriverWait(driver, timeout);
  WebElement ele = null;
  try {
       ele = wait.until(ExpectedConditions
            .presenceOfElementLocated(locator));
  } catch (Exception e) {
        throw e;
 }
 return ele;
}

protected WebElement waitForNotPresent(final String locator, long timeout) {
    timeout = timeout * 1000;
    long startTime = System.currentTimeMillis();
    WebElement ele = null;
    while ((System.currentTimeMillis() - startTime) < timeout) {
        try {
            ele = findElement(locator);
            Thread.sleep(1000);
        } catch (Exception e) {
            break;
        }
    }
    return ele;
}

每当您需要等待元素存在时,请使用预期参数调用waitForPresent方法。

答案 3 :(得分:0)

一个简单的例子就是你的代码

try
{
    Thread.sleep(10000); // 1000 milliseconds is one second.
}
catch (InterruptedException ex)
{
    Thread.currentThread().interrupt();
}
WebElement username = driver.findElement(By.id("UserName"));
username.sendKeys(username);

并将其更改为

String username = "username123";
WebDriverWait wait = new WebDriverWait(driver, 10); // 10 seconds
WebElement usernameField = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("UserName")));
usernameField.sendKeys(username);

定义wait后,您可以反复重复使用它,它将具有相同的属性,例如10秒的等待时间。

String password = "abc123";
WebElement passwordField = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("Password")));
passwordField.sendKeys(password);

注意:我注意到您使用的是username.sendKeys(username);。我假设/希望这不是实际代码,因为.sendKeys()需要String,而username定义为WebElement。我在我的代码中修复它并以不同的方式命名。