2013-04-15 11 views
5

Trong mã trình duyệt web nếu tôi sử dụng thread.sleep(20000). Nó chờ 20 giây, và mã của tôi cũng hoạt động tốt. Để lưu trữ tương tự nếu tôi sử dụng chờ đợi tiềm ẩn nhưwebdriver implicitWait không hoạt động như mong đợi

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

Nó không chờ đợi một cách mạnh mẽ trong 20 giây và đi đến bước tiếp theo chỉ trong 3-4 giây. và trang vẫn đang tải.

Đây là tình huống có dây khi tôi đang sử dụng thông báo chờ để tìm một số yếu tố. nếu các phần tử vẫn đang tải trên trang, nó không hiển thị lỗi và thực hiện kiểm tra.

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) 
    .withTimeout(50, TimeUnit.SECONDS) 
    .pollingEvery(5, TimeUnit.SECONDS) 
    .ignoring(NoSuchElementException.class); 

WebElement foo = wait.until(new Function<WebDriver, WebElement>() { 
    public WebElement apply(WebDriver driver) { 
    return driver.findElement(By.id("jxxx")); 
    } 
}); 

Nhưng nếu tôi nói sai ID chờ trong 50 giây nhưng thử nghiệm khác đã trôi qua mà không nhấp vào .. không hiển thị lỗi nào.

Câu hỏi của tôi là làm thế nào tôi nên tránh Thread.sleep() như các phương pháp selen khác không giúp tôi ..

+0

cảm ơn vì đã xem xét @JimEvans này, tôi đã chỉnh sửa mã của mình và hiện chỉ sử dụng chế độ chờ thông thạo, nhưng không có lỗi nào và không làm bất kỳ điều gì. – user2254173

Trả lời

3

Sử dụng dưới phương pháp để chờ đợi cho một phần tử:

public boolean waitForElementToBePresent(By by, int waitInMilliSeconds) throws Exception 
{ 

    int wait = waitInMilliSeconds; 
    int iterations = (wait/250); 
    long startmilliSec = System.currentTimeMillis(); 
    for (int i = 0; i < iterations; i++) 
    { 
     if((System.currentTimeMillis()-startmilliSec)>wait) 
      return false; 
     List<WebElement> elements = driver.findElements(by); 
     if (elements != null && elements.size() > 0) 
      return true; 
     Thread.sleep(250); 
    } 
    return false; 
} 

Và dưới đây là phương pháp chờ trang tải:

public void waitForPageLoadingToComplete() throws Exception { 
    ExpectedCondition<Boolean> expectation = new ExpectedCondition<Boolean>() { 
     public Boolean apply(WebDriver driver) { 
      return ((JavascriptExecutor) driver).executeScript(
        "return  document.readyState").equals("complete"); 
     } 
    }; 
    Wait<WebDriver> wait = new WebDriverWait(driver, 30); 
    wait.until(expectation); 
} 

Giả sử bạn đang đợi tải trang. Sau đó, gọi phương thức thứ nhất với thời gian chờ đợi và bất kỳ phần tử nào xuất hiện sau khi tải trang, sau đó nó sẽ trả về true, một cách khôn ngoan khác false. Sử dụng nó như,

waitForElementToBePresent(By.id("Something"), 20000) 

Hàm được gọi ở trên đợi cho đến khi tìm thấy phần tử đã cho trong khoảng thời gian nhất định.

Hãy thử bất kỳ mã dưới đây sau khi phương pháp trên

WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds); 
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>)); 

hoặc

wait.until(ExpectedConditions.elementToBeClickable(By.id<locator>)); 

Cập nhật:

public boolean waitForTextFiled(By by, int waitInMilliSeconds, WebDriver wdriver) throws Exception 
    { 
     WebDriver driver = wdriver; 
     int wait = waitInMilliSeconds; 
     int iterations = (wait/250); 
     long startmilliSec = System.currentTimeMillis(); 
     for (int i = 0; i < iterations; i++) 
     { 
      if((System.currentTimeMillis()-startmilliSec)>wait) 
       return false; 
      driver.findElement(By.id("txt")).sendKeys("Something"); 
      String name = driver.findElement(by).getAttribute("value"); 

      if (name != null && !name.equals("")){ 
       return true; 
      } 
      Thread.sleep(250); 
     } 
     return false; 
    } 

này sẽ cố gắng văn bản nhập vào đến lĩnh vực văn bản cho đến thời điểm nhất định trong millis. Nếu getAttribute() không phù hợp trong trường hợp sử dụng của bạn getText(). Nếu văn bản được enetered thì nó trả về true. Đặt thời gian tối đa mà bạn có thể đợi đến.

+0

Cảm ơn bạn đã trả lời. nhưng vấn đề là nếu trang vẫn còn trong tình trạng tải, tôi không biết làm thế nào trình điều khiển tìm thấy tất cả các định vị. và vượt qua bài kiểm tra. Nhưng thực tế nó không nhập hoặc nhấp vào bất kỳ yếu tố nào. Nhưng nếu tôi đặt Thread.sleep nó chờ đợi và điền vào và nhấp vào các yếu tố. tải trang hoàn hảo chỉ tôi đặt trình điều khiển thread.sleep()  – user2254173

+0

tìm trình định vị khi các phần tử tương ứng chỉ hiển thị.Bạn phải đợi cho đến khi một trang được tải thành công và hoàn toàn. Sau đó, chỉ tất cả các phần tử có thể nhìn thấy và có thể được xác định bởi trình điều khiển với các bộ định vị phần tử thích hợp. xem chỉnh sửa của tôi. – user2087450

+0

Tôi đã sử dụng mã. Và nó chờ đợi cho phần tử để trình bày, Nhưng chỉ và chỉ khi tôi đặt thread.sleep() văn bản viết của nó trong hộp đầu vào (trong phần tử đó). như là yếu tố là alraedy nạp tại sao không viết ??? waitForElementToBePresent (By.id ("txt"), 20000); driver.manage(). window(). maximum(); Thread.sleep (10000); driver.findElement (By.id ("txt")). sendKeys ("văn bản"); – user2254173

0

Bạn có thể muốn thử phần tử này để hiển thị trên màn hình.

new WebDriverWait(10, driver).until(ExpectedConditions.visibilityOfElementLocated(By.id("jxxx")). 

Trong trường hợp này, thời gian chờ tối đa là 10 giây.

+0

Cảm ơn bạn đã trả lời. nhưng vấn đề là nếu trang vẫn còn trong tình trạng tải, tôi không biết làm thế nào trình điều khiển tìm thấy tất cả các định vị. và vượt qua bài kiểm tra. Nhưng thực tế nó không nhập hoặc nhấp vào bất kỳ yếu tố nào. Nhưng nếu tôi đặt Thread.sleep nó chờ đợi và điền vào và nhấp vào các yếu tố. tải trang hoàn hảo chỉ tôi đặt thread.sleep()  – user2254173

+0

Tôi thấy rằng bạn đang chờ đợi cho đến khi phần tử có mặt. Kiểm tra xem phần tử có xuất hiện không nếu phần tử được tải trong DOM, cho dù có hiển thị hay không. Chờ đợi cho các yếu tố để trở thành có thể nhìn thấy là điều phải làm. –