2016-08-01 57 views
0

我想登录和搜索记录基于从日历中选择的日期。我在每一步之后都使用了try catch异常。我需要用WebDriverWait替换try catch。但问题是我在页面上有通过id或XPath识别的字段。所以我没有找到如何实现WebDriverWait而不是try catch的方法。谁能帮我吗?以下是我的代码结构的细节。我如何更改尝试捕获异常WebDriverWait

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(); 
} 

回答

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。我将其固定在我的代码中,并将其命名为两个不同的名称

+0

先生。看起来你的解决方案已经清除了我整天挣扎的所有困惑。是的,我拼错了username.sendKeys(username)而不是username.sendKeys(userName)和(passWord)。 – Arvind

+0

@JeffC ...我得到“无法实例化类detailsPkg_user.DetailSearch”错误。当我在“public class Login”下定义“WebDriverWait wait = new WebDriverWait(driver,10); // 10 seconds”时。 – Arvind

+0

@避免你得到的错误与你所引用的行不相关。我建议你用细节开始一个新问题,这样你可以得到帮助。 – JeffC

1

我原以为你会更好地添加一个隐含的等待,例如,一旦你设置你的驱动程序对象添加以下行:

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

我试过隐含的等待ealier。但没有解决。这是我转向尝试赶上。 – Arvind

+0

当你说它不起作用时,你是什么意思?它还没有找到这个元素,你设定了多久? – Josh

+0

它在登录标准后没有找到元素。我将时间设定为10秒 – Arvind

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;

它可能是,如果你不能确定隐TIMEWAIT值更有用。 (具体关于事件和结果)

+0

隐含的方式对我来说并没有解决,因为我在开始时尝试了它。让我用这种方法检查 – Arvind

0

T这里是WebDriverWait硒的功能,可以设置显式等待。您使用的是硒驱动程序,那么使用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方法。

+0

presenceOfElementLocatedBy不是一个适当的类型,甚至visibilityOfAllElementsLocatedBy也是如此。 – Arvind

+0

你能告诉我你正在面临的问题吗?我给出了可以通过带参数的方法访问的泛化方法。在我的情况下,它正在正常工作。 –