2013-11-18 2 views
9

Я пытаюсь щелкнуть по объекту, чтобы показать всплывающий список значений.Как использовать clickandwait в Selenium Webdriver с помощью Java?

Я использовал следующий скрипт, но не смог заполнить всплывающее окно со списком.

Driver.findElement(By.xpath(OR.getProperty(Object))).click(); 
    Thread.sleep(1000L); 

Есть ли другой способ щелкнуть и подождать объекта?

+1

проверить это - http://stackoverflow.com/questions/11736027/webdriver-wait-for-element – Ievgen

ответ

10
Driver.findElement(By.xpath(OR.getProperty(Object))).click(); 
WebDriverWait wait = new WebDriverWait(Driver, timeoutInSeconds); 
wait.until(ExpectedConditions.elementToBeClickable(By.id("yourId"))); 

Есть другие условия, такие как visibilityOf так выбрать тот, который подходит вам больше всего - documentation here.

+0

Я попытался выше сценарий, еще мой список значений поп -up не отображается. Есть ли другой способ справиться с всплывающим окном. Я пробовал в Selenium IDE, он работает для команды «clickandwait». Расскажите, как справиться с этим в Selenium Webdriver. – user2943890

1
  String mainWindowHandle = driver.getWindowHandle(); 
      System.out.println(mainWindowHandle); 

      wait.until(ExpectedConditions.elementToBeClickable(By.xpath(OR.getProperty(Object))); 
      Driver.findElement(By.xpath(OR.getProperty(Object))).click(); 

      PageUtil.sleep(3000); 
      Set<String> s1 = driver.getWindowHandles(); 

      Iterator<String> ite = s1.iterator(); 
      while (ite.hasNext()) { 
       String popupHandle = ite.next().toString(); 
       System.out.println(popupHandle + " Present Pop Up window name"); 
       if (!popupHandle.contains(mainWindowHandle)) { 
        driver.switchTo().window(popupHandle); 
       } 
      } 


WebDriverWait wait = new WebDriverWait(Driver, timeoutInSeconds); 
wait.until(ExpectedConditions.elementToBeClickable(By.id("yourId"))); 
Driver.findElement(By.id("yourId")).click(); 

driver.switchTo().window(mainWindowHandle); 
0

После нажатия кнопки вы можете подождать с помощью FluentWait,

// Waiting 30 seconds for an element to be present on the page, checking 
    // for its presence once every 5 seconds. 
    Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) 
     .withTimeout(30, SECONDS) 
     .pollingEvery(5, SECONDS) 
     .ignoring(NoSuchElementException.class); 

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

refer this for more info

0

Я не совсем знаком с синтаксисом Java, но я дам вам PHP код, и вы можете написать аналогичными , Идея состоит в том, чтобы найти элемент HTML по тегу и получить его идентификатор ДО ТОГО, ЧТОБЫ ВЫБРАТЬ. Затем ПОСЛЕ CLICK дождитесь изменения идентификатора.

Это выглядит следующим образом:

class MySeleniumCondition extends WebDriverExpectedCondition{ 
    public static function htmlElementIdIsNot($htmlElementId) { 
    return new WebDriverExpectedCondition(
     function ($driver) use ($htmlElementId) { 
     $htmlElement = $driver->findElement(WebDriverBy::tagName('html')); 
     return $htmlElementId != $htmlElement->getId(); 
     } 
    ); 
    } 
} 

    // .............. somehere in a class: 

    public function waitForNewPage($oldHtmlElementId, $time = 10){ 
    try{ 
     $this->driver->wait($time)->until(
     MySeleniumCondition::htmlElementIdIsNot(
      $oldHtmlElementId 
     ) 
    ); 
     return true; 
    }catch(TimeOutException $e){ 
     return false; 
    } 
    } 

    // use this only when you are sure the page will reload 
    public function clickAndWait(WebDriverBy $locator, $time = 10){ 
    $webElement = $this->driver->findElement($locator); 
    $oldHtmlElement = $driver->findElement(WebDriverBy::tagName('html')); 
    $oldHtmlElementId = $oldHtmlElement->getId(); 
    $webElement->click(); 
    $this->waitForNewPage($oldHtmlElementId, $time); 
    return true; 
    } 
Смежные вопросы