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; } }
public void AddRocketToShoppingCart(string rocketName) { Open(); MainPageElements.GetProductBoxByName(rocketName).Click(); Driver.WaitForAjax(); MainPageElements.ViewCartButton.Click(); }
public void GifIsShownWhenEnteredNotAPrimeNumber() { var primeCheckerPage = new MainPageElements(_driver); primeCheckerPage.EnterANumber("6"); primeCheckerPage.ClickCheckIfItsPrimeButton(); primeCheckerPage.CheckGifIsShown().Should().BeTrue(); }
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!"); }
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. :("); }
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(); }
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. :("); }
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"); }
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); }
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); }
private MainPage(Driver driver) : base(driver) { Elements = new MainPageElements(driver); Assertions = new MainPageAssertions(Elements); }
public MainPage(IElementFindService elementFindService, INavigationService navigationService) : base(elementFindService, navigationService) { Elements = new MainPageElements(elementFindService); Assertions = new MainPageAssertions(Elements); }
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); }