2014-01-03 1 views
3

У меня странная ошибка, которую я пытаюсь воссоздать с тестом. Я знаю, что вызывает ошибку и как ее исправить, но я не могу понять, как правильно ее протестировать.Как проверить, что страница перезагрузилась, когда я нажимаю ссылку на текущую страницу?

Сценарий:

  • Мой браузер на http://example.com/foo
  • я нажимаю ссылку на эту страницу с HREF = "/ Foo" (та же страница)
  • Браузер должен перезагрузить ту же страницу

Я пробовал:

class SamePageHyperlinkSpec extends StatelessUserWebGebSpec { 

    def 'users is on Foo page and clicks foo link'() { 

     when: 
      to FooPage 

     then: 
      // navigation.foo is a property in a super class that references 
      // a particular navigation item 
      navigation.foo.click() 

     and: 
      at FooPage 
    } 
} 

... но это дало ложный результат, потому что, хотя браузер не перезагружал страницу, он уже был на этой странице. Итак, я решил, взять бы взглянуть на PageChangeListener, который должен позволить мне годен/не годен на изменение страницы:

class SamePageHyperlinkSpec extends StatelessUserWebGebSpec { 

    def 'users is on Foo page and clicks foo link'() { 

     given: 
      def listener = new MyPageChangeListener() 
      browser.registerPageChangeListener(listener) 

     when: 
      to FooPage 
     and: 
      listener.changeCount = 0 

     then: 
      // navigation.foo is a property in a super class that references 
      // a particular navigation item 
      navigation.foo.click() 

     and: 
      at FooPage 

     and: 
      listener.changeCount == 1 
    } 
} 

class MyPageChangeListener implements PageChangeListener { 

    int changeCount = 0 

    void pageWillChange(Browser browser, Page oldPage, Page newPage) { 
     println "browser '$browser' changing page from '$oldPage' to '$newPage'" 
     changeCount++ 
    } 
} 

... это не удастся (как и положено), когда нет перезагрузки страницы, однако он также терпит неудачу, когда есть перезагрузка страницы, потому что страница, на которой она заканчивается, такая же, ergo no page изменение произошло.

Я также попытался дублировать класс страницы (и это «при закрытии»), однако это всегда проходило независимо от того, была ли перезагрузка страницы или нет.

Итак, как я могу проверить, что страница перезагрузилась, когда я нажимаю ссылку на текущую страницу?

+0

Есть ли что-то, что меняется на странице при перезагрузке? например поля или элементы, видимые и т. д.? –

+0

@PaulHarris Nope, nada – BenLanc

+3

Я пытаюсь думать о чем-то другом, кроме этого, но это сработает ... в основном вы могли бы использовать свой драйвер для JavascriptExecutor, а затем выполнить Javascript, который добавит элемент на страницу.Затем вы можете перезагрузить, и вы узнаете, что это сделано, потому что элемент, который вы только что добавили, исчезнет. Должен быть лучший способ, но мой ум сейчас странно идиотский. –

ответ

0

Принимая свинца @PaulHarris', подход JS кажется, сделать трюк:

class SamePageHyperlinkSpec extends StatelessUserWebGebSpec { 

    def 'users is on Foo page and clicks foo link'() { 

     when: 
      to FooPage 

     and: 
      browser.js.exec '$(document.body).attr("data-not-reloaded",true);' 

     then: 
      // navigation.foo is a property in a super class that references 
      // a particular navigation item 
      navigation.foo.click() 

     and: 
      at FooPage 

     and: 
      browser.js.exec 'return $(document.body).attr("data-not-reloaded") === undefined'; 
    } 
} 
0

Here это лучший и проверенный вариант реализации WaitForPageLoad в C# .Net

public void WaitForPageLoad(int maxWaitTimeInSeconds) { 
string state = string.Empty; 
try { 
    WebDriverWait wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(maxWaitTimeInSeconds)); 

    //Checks every 500 ms whether predicate returns true if returns exit otherwise keep trying till it returns ture 
    wait.Until(d = > { 

     try { 
      state = ((IJavaScriptExecutor) _driver).ExecuteScript(@"return document.readyState").ToString(); 
     } catch (InvalidOperationException) { 
      //Ignore 
     } catch (NoSuchWindowException) { 
      //when popup is closed, switch to last windows 
      _driver.SwitchTo().Window(_driver.WindowHandles.Last()); 
     } 
     //In IE7 there are chances we may get state as loaded instead of complete 
     return (state.Equals("complete", StringComparison.InvariantCultureIgnoreCase) || state.Equals("loaded", StringComparison.InvariantCultureIgnoreCase)); 

    }); 
} catch (TimeoutException) { 
    //sometimes Page remains in Interactive mode and never becomes Complete, then we can still try to access the controls 
    if (!state.Equals("interactive", StringComparison.InvariantCultureIgnoreCase)) 
     throw; 
} catch (NullReferenceException) { 
    //sometimes Page remains in Interactive mode and never becomes Complete, then we can still try to access the controls 
    if (!state.Equals("interactive", StringComparison.InvariantCultureIgnoreCase)) 
     throw; 
} catch (WebDriverException) { 
    if (_driver.WindowHandles.Count == 1) { 
     _driver.SwitchTo().Window(_driver.WindowHandles[0]); 
    } 
    state = ((IJavaScriptExecutor) _driver).ExecuteScript(@"return document.readyState").ToString(); 
    if (!(state.Equals("complete", StringComparison.InvariantCultureIgnoreCase) || state.Equals("loaded", StringComparison.InvariantCultureIgnoreCase))) 
     throw; 
} 
} 
0

Что если вы записываете некоторое значение в текстовое поле страницы, создайте процедуру ожидания, которая ожидает, что это текстовое поле не будет включено на страницу, и после этого вы нажмете ссылку? Таким образом, процедура будет следующей:

1.- Напишите новое значение в текстовом поле или добавьте новый тег html или что-то с помощью js.

2.- Сделать процедуру, чтобы подождать, пока элемент/значение, которое вы добавили на страницу, не будет включено в страницу.

3.- Нажмите на ссылку.

4.- Вызвать код ожидания.

Дайте мне знать, если это сработает для вас.