Beispiel #1
0
        private async Task <RanklistResponse> GetPageAsync(string contestId, MainPageElements tokens, int page)
        {
            Console.WriteLine($"Requesting page {page} of contest {contestId}");

            using var message = CreateRanklistPageRequestMessage(contestId, tokens, page);
            var response = await _httpClient.SendAsync(message);

            if (!response.IsSuccessStatusCode)
            {
                Console.WriteLine(response.StatusCode);
                var content = await response.Content.ReadAsStringAsync();

                Console.WriteLine(content);
                throw new HttpErrorException();
            }

            var json = await response.Content.ReadAsStringAsync();

            try
            {
                return(JsonSerializer.Deserialize <RanklistResponse>(json));
            }
            catch (JsonException)
            {
                await File.WriteAllTextAsync("failed_json.json", json);

                if (json.TrimStart()[0] == '<')
                {
                    // it is most likely a HTML captcha
                    throw new CaptchaEncounteredException();
                }

                throw;
            }
        }
Beispiel #2
0
 public void AddRocketToShoppingCart(string rocketName)
 {
     Open();
     MainPageElements.GetProductBoxByName(rocketName).Click();
     Driver.WaitForAjax();
     MainPageElements.ViewCartButton.Click();
 }
Beispiel #3
0
        public void GifIsShownWhenEnteredNotAPrimeNumber()
        {
            var primeCheckerPage = new MainPageElements(_driver);

            primeCheckerPage.EnterANumber("6");
            primeCheckerPage.ClickCheckIfItsPrimeButton();
            primeCheckerPage.CheckGifIsShown().Should().BeTrue();
        }
Beispiel #4
0
        public void ErrorMessageIsShownWhenEnteredAnInvalidSymbol([Values("", "a", "*")] string symbol)
        {
            var primeCheckerPage = new MainPageElements(_driver);

            primeCheckerPage.EnterANumber(symbol);
            primeCheckerPage.ClickCheckIfItsPrimeButton();
            primeCheckerPage.ErrorMessageFieldIsShown().Should().BeTrue();
            primeCheckerPage.GetErrorMessageText().Should().Contain("You are more likely to get a joke if it's a positive integer!");
        }
Beispiel #5
0
        public void AJokeIsShownWhenEnteredAPrimeNumber()
        {
            var primeCheckerPage = new MainPageElements(_driver);

            primeCheckerPage.EnterANumber("7");
            primeCheckerPage.ClickCheckIfItsPrimeButton();
            primeCheckerPage.CheckAJokeFieldIsShown().Should().BeTrue();
            primeCheckerPage.GetJokeText().Should().NotContain("No joke this time. :(");
        }
Beispiel #6
0
        public void ErrorMessageDisappearsWhenValidNumberIsEntered()
        {
            var primeCheckerPage = new MainPageElements(_driver);

            primeCheckerPage.EnterANumber("/");
            primeCheckerPage.ClickCheckIfItsPrimeButton();
            primeCheckerPage.ErrorMessageFieldIsShown().Should().BeTrue();
            primeCheckerPage.GetErrorMessageText().Should().Contain("You are more likely to get a joke if it's a positive integer!");
            primeCheckerPage.ClearNumberField();
            primeCheckerPage.EnterANumber("7");
            primeCheckerPage.ClickCheckIfItsPrimeButton();
            primeCheckerPage.ErrorMessageFieldIsShown().Should().BeFalse();
        }
Beispiel #7
0
        public void GifSwitchesToJoke()
        {
            var primeCheckerPage = new MainPageElements(_driver);

            primeCheckerPage.EnterANumber("6");
            primeCheckerPage.ClickCheckIfItsPrimeButton();
            primeCheckerPage.CheckGifIsShown().Should().BeTrue();
            primeCheckerPage.ClearNumberField();
            primeCheckerPage.EnterANumber("7");
            primeCheckerPage.ClickCheckIfItsPrimeButton();
            primeCheckerPage.WaitForGifToBeOffscreen();
            primeCheckerPage.CheckGifIsShown().Should().BeFalse();
            primeCheckerPage.GetJokeText().Should().NotContain("No joke this time. :(");
        }
Beispiel #8
0
        private async Task <RanklistResponse> TryGetPageAsync(string contestId, MainPageElements tokens, int page)
        {
            for (var i = 0; i < MaxRetryLimit; i++)
            {
                try
                {
                    return(await GetPageAsync(contestId, tokens, page));
                }
                catch (CaptchaEncounteredException)
                {
                    Console.WriteLine("Captcha encountered, going to sleep for 2 min");
                    Thread.Sleep(TimeSpan.FromMinutes(2));
                }
            }

            throw new CaptchaEncounteredException("Too many captchas, exiting");
        }
Beispiel #9
0
        private async Task <MainPageElements> GetMainPageElements(string contestId)
        {
            var contestUrl = $"{RanklistUrl}/{contestId}";
            var response   = await _httpClient.GetAsync(contestUrl);

            if (!response.IsSuccessStatusCode)
            {
                Console.WriteLine($"Got {response.StatusCode} from {contestUrl}");
                throw new HttpErrorException();
            }

            var tokens = new MainPageElements();

            var rawHtml = await response.Content.ReadAsStringAsync();

            var htmlDoc = new HtmlDocument();

            htmlDoc.LoadHtml(rawHtml);

            var xsrfNode      = htmlDoc.DocumentNode.SelectSingleNode("//body/script");
            var xsrfStatement = xsrfNode.InnerText;

            tokens.XsrfToken = ParseXsrfStatement(xsrfStatement);
            Console.WriteLine($"Got xsrf token: {tokens.XsrfToken}");

            try
            {
                var breadCrumbLinks = htmlDoc.DocumentNode.SelectNodes("//div[@class='breadcrumb']/a");
                var contestLink     = breadCrumbLinks[1];
                tokens.ContestName = contestLink.InnerText;
                Console.WriteLine($"Got contest name: {tokens.ContestName}");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Failed to get contest name");
                Console.WriteLine(ex);
                // if the HTML structure changes, this will fail; it's not so important, so we don't want to
                // crash the program because of this
            }

            return(tokens);
        }
Beispiel #10
0
 public MainPage(Driver driver) : base(driver)
 {
     MainPageElements   = new MainPageElements(driver);
     MainPageAssertions = new MainPageAssertions(MainPageElements);
 }
 public MainPage()
 {
     Elements   = new MainPageElements(LoggingSingletonDriver.Instance);
     Assertions = new MainPageAssertions(Elements);
 }
Beispiel #12
0
 private MainPage(Driver driver)
     : base(driver)
 {
     Elements   = new MainPageElements(driver);
     Assertions = new MainPageAssertions(Elements);
 }
Beispiel #13
0
 public MainPage(IElementFindService elementFindService, INavigationService navigationService)
     : base(elementFindService, navigationService)
 {
     Elements   = new MainPageElements(elementFindService);
     Assertions = new MainPageAssertions(Elements);
 }
Beispiel #14
0
        private HttpRequestMessage CreateRanklistPageRequestMessage(string contestId, MainPageElements tokens,
                                                                    int page)
        {
            var url            = $"{RanklistApiUrl}/{contestId}?sortBy=rank&order=asc&page={page}&itemsPerPage=50";
            var requestMessage = new HttpRequestMessage(HttpMethod.Get, url);

            requestMessage.Headers.Add(XsrfTokenHeader, tokens.XsrfToken);
            return(requestMessage);
        }