Норка с Selenium2: следуйте всем перенаправлениям

Как заставить Selenium2 следовать всем перенаправлениям, прежде чем делать какие-либо утверждения?

  Scenario: Guest member can pay with card
    When I go to "/test"
    #test page redirects to "/auth" which then redirects to "/main"
    Then I should be redirected to "/main"

Я подумал, что могу просто подождать:

  /**
   * @Then /^I should be redirected to "([^"]*)"$/
   */
  public function assertRedirect($url)
  {
    $this->getSession()->wait(10000);

    $this->assertPageAddress($url);
  }

Проблема в том, что, как бы долго я ни ждал, я всегда оказываюсь на странице "/auth", а не "/main".

ОБНОВЛЕНИЕ: Оказывается, проблема мифическая, селен не делает ничего особенного, и браузер по умолчанию следит за перенаправлениями, как обычно. В моем случае страница, которая должна была производить перенаправление, на самом деле отправляла ответ 200.

1 ответ

Решение

Я столкнулся с ситуацией, похожей на вашу. Я установил метод ожидания, который опрашивает элемент каждую секунду в течение x секунд, ожидая, пока элемент станет видимым. Затем я передаю Xpath элементу, доступному только на последней странице, или /main в вашем случае. Вот метод, который я использую в Java.

 public void waitForElement(WebDriver driver, final String xpath)
 {
     //Set up fluentWait to wait for 35 seconds polling every 1
     Wait<WebDriver> fluentWait = new FluentWait<WebDriver>(driver)
         .withTimeout(35, TimeUnit.SECONDS)
         .pollingEvery(1, TimeUnit.SECONDS)
         .ignoring(NoSuchElementException.class);

     WebElement element;

     //Look for element, if not found start fluentWait
     try
     {
         element = driver.findElement(By.xpath(xpath));
     }
     catch (WebDriverException e)
     {
         logger.info("[getElementByXpath] Element not initially found. Starting fluentWait ["+xpath+"]");

         try
         {
             element = fluentWait.until(new Function<WebDriver, WebElement>() {
                 public WebElement apply(WebDriver d) {

                     return d.findElement(By.xpath(xpath));
                 }
             });
         }
         catch (WebDriverException f)
         {
             logger.info("[getElementByXpath] FluentWait findElement threw exception:\n\n" + f +"\n\n");

             throw new WebDriverException("Unable to find element ["+xpath+"]");
         }
     }

     //Once we've found the element wait for element to become visible
     fluentWait.until(ExpectedConditions.visibilityOf(element));
 }

Вам может понадобиться или не потребоваться последнее сообщение fluentWait для наглядности, так как после возвращения элемента вы попадете на правильную / главную страницу.

Надеюсь это поможет. Удачи!

Другие вопросы по тегам