예제 #1
0
        public void It_checks_all_of_the_states_in_a_robust_query_expecting_true()
        {
            bool queriedState1 = false;
            bool queriedState2 = false;
            var state1 = new State(new LambdaQuery<bool>(() =>
                                       {
                                           queriedState1 = true;
                                           return false;
                                       }));
            var state2 = new State(new LambdaQuery<bool>(() =>
                                       {
                                           queriedState2 = true;
                                           return true;
                                       }));
            var state3 = new State(new LambdaQuery<bool>(() => true));
            state3.CheckCondition();

            var robustWrapper = new SpyTimingStrategy();
            robustWrapper.StubQueryResult(true, true);

            var session = BuildSession(robustWrapper);

            Assert.That(session.FindState(new [] {state1, state2, state3}), Is.SameAs(state3));

            Assert.IsFalse(queriedState1);
            Assert.IsFalse(queriedState2);

            var query = robustWrapper.QueriesRan<bool>().Single();
            var queryResult = query.Run();
            Assert.IsTrue(queryResult);

            Assert.IsTrue(queriedState1);
            Assert.IsTrue(queriedState2);
        }
        public void RetryUntilTimeout_is_exposed_on_the_session()
        {
            var calledOnWrapper = false;

            browserSession.RetryUntilTimeout(() =>
            {
                calledOnWrapper = true;
            });
            SpyTimingStrategy.QueriesRan <object>().First().Run();
            Assert.That(calledOnWrapper, Is.True);
        }
예제 #3
0
        protected void Queries_robustly_reversing_result <T>(bool stubResult, Func <T, Options, bool> subject, Action <T, bool, DriverScope> stub, T locator)
        {
            stub(locator, stubResult, browserSession);
            SpyTimingStrategy.StubQueryResult(true, !stubResult);

            var actualImmediateResult = subject(locator, sessionConfiguration);

            Assert.That(actualImmediateResult, Is.EqualTo(!stubResult), "Result was not found robustly");

            var queryResult = RunQueryAndCheckTiming <bool>();

            Assert.That(queryResult, Is.EqualTo(!stubResult));
        }
        public void Query_is_exposed_on_the_session()
        {
            Func <string> query = () => "query result";

            SpyTimingStrategy.StubQueryResult("expected query result", "immediate query result");

            Assert.That(browserSession.Query(query, "expected query result"), Is.EqualTo("immediate query result"));

            var robustQuery = SpyTimingStrategy.QueriesRan <string>().First();
            var queryResult = robustQuery.Run();

            Assert.That(queryResult, Is.EqualTo("query result"));
        }
        public void Return_from_RetryUntilTimeout_is_exposed_on_the_session()
        {
            Func <string> function = () => "The expected result";

            SpyTimingStrategy.StubQueryResult(SpyTimingStrategy.NO_EXPECTED_RESULT, "immediate result");

            Assert.That(browserSession.RetryUntilTimeout(function), Is.EqualTo("immediate result"));

            var query       = SpyTimingStrategy.QueriesRan <string>().First();
            var queryResult = query.Run();

            Assert.That(queryResult, Is.EqualTo("The expected result"));
        }
예제 #6
0
        public void SetUp()
        {
            driver               = new FakeDriver();
            SpyTimingStrategy    = new SpyTimingStrategy();
            fakeWaiter           = new FakeWaiter();
            stubUrlBuilder       = new StubUrlBuilder();
            sessionConfiguration = new SessionConfiguration();
            browserSession       = TestSessionBuilder.Build(sessionConfiguration, driver, SpyTimingStrategy, fakeWaiter, new SpyRestrictedResourceDownloader(),
                                                            stubUrlBuilder);

            elementScope = browserSession.FindXPath(".");
            popupScope   = browserSession.FindWindow("popup");
        }
예제 #7
0
        public void It_makes_robust_call_to_find_then_hover_element_on_underlying_driver()
        {
            var element = new StubElement();

            driver.StubId("something_to_hover", element, browserSession, sessionConfiguration);
            SpyTimingStrategy.AlwaysReturnFromSynchronise(element);

            browserSession.FindId("something_to_hover").Hover();

            Assert.That(driver.HoveredElements, Has.No.Member(element));

            RunQueryAndCheckTiming();

            Assert.That(driver.HoveredElements, Has.Member(element));
        }
        public void It_makes_robust_call_to_find_then_clicks_element_on_underlying_driver()
        {
            var element = new StubElement();

            driver.StubId("something_to_click", element, browserSession, sessionConfiguration);
            SpyTimingStrategy.AlwaysReturnFromSynchronise(element);

            var toCheck = browserSession.FindCss("something_to_click");

            toCheck.Uncheck();

            Assert.That(driver.UncheckedElements, Has.No.Member(toCheck), "Uncheck was not synchronised");

            RunQueryAndCheckTiming();

            Assert.That(driver.UncheckedElements, Has.Member(toCheck));
        }
예제 #9
0
        public void It_sends_keys_to_element_via_underlying_driver()
        {
            var element = new StubElement();

            driver.StubId("something", element, browserSession, sessionConfiguration);
            SpyTimingStrategy.AlwaysReturnFromRobustly(element);

            browserSession.FindId("something")
            .SendKeys("some keys to press");

            Assert.That(driver.SentKeys.Count, Is.EqualTo(0));

            RunQueryAndCheckTiming();

            Assert.That(driver.SentKeys.Count, Is.EqualTo(1));
            Assert.That(driver.SentKeys[element], Is.EqualTo("some keys to press"));
        }
예제 #10
0
        public void It_finds_then_synchronises_click_element_on_underlying_driver()
        {
            var element = new StubElement();

            driver.StubId("something_to_click", element, browserSession, sessionConfiguration);
            SpyTimingStrategy.AlwaysReturnFromSynchronise(element);

            var elementScope = browserSession.FindId("something_to_click");

            elementScope.Click();

            Assert.That(driver.ClickedElements, Has.No.Member(elementScope), "Click was not synchronised");

            RunQueryAndCheckTiming();

            Assert.That(driver.ClickedElements, Has.Member(elementScope));
        }
        public void It_makes_robust_call_to_find_then_clicks_element_on_underlying_driver()
        {
            var element = new StubElement();

            driver.StubId("something_to_fill_in", element, browserSession, sessionConfiguration);
            SpyTimingStrategy.AlwaysReturnFromSynchronise(element);

            var elementScope = browserSession.FindId("something_to_fill_in");

            elementScope.FillInWith("some filled in stuff");

            Assert.That(driver.SetFields.Keys, Has.No.Member(elementScope));

            RunQueryAndCheckTiming();

            Assert.That(driver.SetFields.Keys, Has.Member(elementScope));
            Assert.That(driver.SetFields[elementScope].Value, Is.EqualTo("some filled in stuff"));
        }
예제 #12
0
        protected void Queries_robustly <T>(bool stubResult, Func <T, Options, bool> subject, Action <T, bool, DriverScope> stub, T locator)
        {
            stub(locator, stubResult, browserSession);
            SpyTimingStrategy.StubQueryResult(true, !stubResult);

            var individualTimeout = TimeSpan.FromMilliseconds(DateTime.UtcNow.Millisecond);

            var options = new SessionConfiguration {
                Timeout = individualTimeout
            };

            var actualImmediateResult = subject(locator, options);

            Assert.That(actualImmediateResult, Is.EqualTo(!stubResult), "Result was not found robustly");

            var queryResult = RunQueryAndCheckTiming <bool>(individualTimeout);

            Assert.That(queryResult, Is.EqualTo(stubResult));
        }
예제 #13
0
        protected void Should_test_predicate_against_query_results_and_retry_on_failure(Func <string, Func <IEnumerable <SnapshotElementScope>, bool>, Options, IEnumerable <SnapshotElementScope> > subject, Action <string, IEnumerable <ElementFound>, Scope, Options> stub)
        {
            var locator = "Find me " + DateTime.Now.Ticks;

            var individualTimeout = TimeSpan.FromMilliseconds(DateTime.UtcNow.Millisecond);

            var expectedImmediateResult = new[] { new StubElement(), new StubElement() };
            var expectedDeferredResult  = new[] { new StubElement(), new StubElement() };

            var options = new Options {
                Timeout = individualTimeout
            };

            SpyTimingStrategy.AlwaysReturnFromRobustly(expectedImmediateResult.Select(e => new SnapshotElementScope(e, browserSession, options)));

            stub(locator, expectedDeferredResult, browserSession, options);

            VerifyFoundRobustly(subject, 0, locator, (elements) => true, expectedDeferredResult, expectedImmediateResult, options);
            VerifyFoundRobustlyAndThrows <MissingHtmlException>(subject, 1, locator, (elements) => false, null, expectedImmediateResult, options);
            VerifyFoundRobustlyAndThrows <TestException>(subject, 2, locator, (elements) => { throw new TestException("Thrown in FindAll predicate"); }, null, expectedImmediateResult, options);
        }
예제 #14
0
        public void When_query_returns_false_It_raises_an_exception()
        {
            var state1 = new State(new AlwaysSucceedsQuery <bool>(false, true, TimeSpan.Zero, SessionConfiguration.RetryInterval));
            var state2 = new State(new AlwaysSucceedsQuery <bool>(false, true, TimeSpan.Zero, SessionConfiguration.RetryInterval));

            var robustWrapper = new SpyTimingStrategy();

            robustWrapper.StubQueryResult(true, false);

            var session = BuildSession(robustWrapper);

            try
            {
                session.FindState(state1, state2);
                Assert.Fail("Expected MissingHTMLException");
            }
            catch (MissingHtmlException e)
            {
                Assert.That(e.Message, Is.EqualTo("None of the given states was reached within the configured timeout."));
            }
        }
        public void It_checks_for_missing_elements_with_synchronise()
        {
            browserSession = TestSessionBuilder.Build(new SessionConfiguration(), driver, SpyTimingStrategy, null, null, null,
                                                      new ThrowsWhenMissingButNoDisambiguationStrategy());

            SpyTimingStrategy.StubQueryResult(true, false);

            driver.StubId("Signout", new StubElement(), browserSession, sessionConfiguration);
            browserSession.FindId("Signin").Missing();
            browserSession.FindId("Signout").Missing();

            var firstQuery  = SpyTimingStrategy.QueriesRan <bool>().ElementAt(0);
            var secondQuery = SpyTimingStrategy.QueriesRan <bool>().ElementAt(1);

            var firstQueryResult = RunQueryAndCheckTiming(firstQuery);

            Assert.That(firstQueryResult, Is.True);

            var secondQueryResult = RunQueryAndCheckTiming(secondQuery);

            Assert.That(secondQueryResult, Is.False);
        }
예제 #16
0
        private void Check_robust_content_query <T>(bool stubResult, string actualContent, Func <T, Options, bool> subject, T toLookFor)
        {
            var window = new StubElement {
                Text = actualContent
            };

            driver.StubCurrentWindow(window);

            SpyTimingStrategy.StubQueryResult(true, !stubResult);

            var individualTimeout = TimeSpan.FromMilliseconds(DateTime.UtcNow.Millisecond);
            var options           = new SessionConfiguration {
                Timeout = individualTimeout
            };

            var actualImmediateResult = subject(toLookFor, options);

            Assert.That(actualImmediateResult, Is.EqualTo(!stubResult), "Result was not found robustly");

            var queryResult = RunQueryAndCheckTiming <bool>(individualTimeout);

            Assert.That(queryResult, Is.EqualTo(stubResult));
        }
예제 #17
0
        public void It_checks_all_of_the_states_in_a_robust_query_expecting_true()
        {
            bool queriedState1 = false;
            bool queriedState2 = false;
            var  state1        = new State(new LambdaQuery <bool>(() =>
            {
                queriedState1 = true;
                return(false);
            }));
            var state2 = new State(new LambdaQuery <bool>(() =>
            {
                queriedState2 = true;
                return(true);
            }));
            var state3 = new State(new LambdaQuery <bool>(() => true));

            state3.CheckCondition();

            var robustWrapper = new SpyTimingStrategy();

            robustWrapper.StubQueryResult(true, true);

            var session = BuildSession(robustWrapper);

            Assert.That(session.FindState(new [] { state1, state2, state3 }), Is.SameAs(state3));

            Assert.IsFalse(queriedState1);
            Assert.IsFalse(queriedState2);

            var query       = robustWrapper.QueriesRan <bool>().Single();
            var queryResult = query.Run();

            Assert.IsTrue(queryResult);

            Assert.IsTrue(queriedState1);
            Assert.IsTrue(queriedState2);
        }
예제 #18
0
        private void Finds_element_robustly_and_returns_property_value <T>(T testValue, Action <StubElement, T> stubProperty, Func <ElementScope, T> getProperty, Func <object, Constraint> constraint = null)
        {
            constraint = constraint ?? Is.SameAs;
            var stubElement = new StubElement();

            stubProperty(stubElement, testValue);

            driver.StubId("some-element", stubElement, browserSession, sessionConfiguration);

            SpyTimingStrategy.AlwaysReturnFromRobustly(stubElement);

            if (typeof(T) == typeof(bool))
            {
                Assert.That(getProperty(browserSession.FindId("some-element")), constraint(testValue));
            }
            else
            {
                Assert.That(getProperty(browserSession.FindId("some-element")), constraint(testValue));
            }

            var queryResult = RunQueryAndCheckTiming();

            Assert.That(queryResult, Is.SameAs(stubElement));
        }
예제 #19
0
        public void It_waits_between_find_and_click_as_configured(int waitMs)
        {
            var stubButtonToBeClicked = StubButtonToBeClicked("Some button locator");
            var expectedWait          = TimeSpan.FromMilliseconds(waitMs);

            sessionConfiguration.WaitBeforeClick = expectedWait;

            var waiterCalled = false;

            fakeWaiter.DoOnWait(milliseconds =>
            {
                Assert.That(milliseconds, Is.EqualTo(expectedWait));

                AssertButtonFound();
                AssertButtonNotClickedYet(stubButtonToBeClicked);

                waiterCalled = true;
            });
            browserSession.ClickButton("Some button locator");
            SpyTimingStrategy.QueriesRan <object>().Last().Run();

            Assert.That(waiterCalled, "The waiter was not called");
            AssertClicked(stubButtonToBeClicked);
        }
예제 #20
0
        public void When_query_returns_false_It_raises_an_exception()
        {
            var state1 = new State(new AlwaysSucceedsQuery<bool>(false, true, TimeSpan.Zero, SessionConfiguration.RetryInterval));
            var state2 = new State(new AlwaysSucceedsQuery<bool>(false, true, TimeSpan.Zero, SessionConfiguration.RetryInterval));

            var robustWrapper = new SpyTimingStrategy();
            robustWrapper.StubQueryResult(true, false);
            
            var session = BuildSession(robustWrapper);

            try
            {
                session.FindState(state1, state2);
                Assert.Fail("Expected MissingHTMLException");
            }
            catch (MissingHtmlException e)
            {
                Assert.That(e.Message, Is.EqualTo("None of the given states was reached within the configured timeout."));
            }
        }
예제 #21
0
 private void ExecuteLastDeferedRobustAction()
 {
     SpyTimingStrategy.QueriesRan <object>().Last().Run();
 }