Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Пройтись по очереди по всем ссылкам на странице

csharp
links
webdriver
selenium
Теги: #<Tag:0x00007fedb7fd41f0> #<Tag:0x00007fedb7fd40b0> #<Tag:0x00007fedb7fdbf40> #<Tag:0x00007fedb7fdbe00>

(sakredit) #1

Есть такой код

static void Main(string[] args)
        {
            IWebDriver browse = new ChromeDriver();
            browse.Manage().Window.Maximize();
            browse.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(50);

            browse.Url = "https://google.com";
            Actions newTab = new Actions(browse);

            List<IWebElement> allinks = browse.FindElements(By.TagName("a")).ToList();

           foreach (var item in allinks)
            {
                newTab.KeyDown(Keys.Control).Click(item).KeyUp(Keys.Control).Perform();
                browse.SwitchTo().Window(browse.WindowHandles.Last());
                Thread.Sleep(5000);
                browse.Close();
                browse.SwitchTo().Window(browse.WindowHandles.First());
                Thread.Sleep(2000);
            }

сначала открывается одна ссылка,но потом начинается кошмар,открывается 2 ссылки,предыдущая и новая,потом 3 ссылки и тд. Возможно проблема в List,но не могу понять,что не так.


(Alexandr D ) #2

Не очень понятно, какие ссылки вы находите.
На странице google.com таких 43 штуки (в моём случае), только вот после двух ссылок драйвер закрывается, т.к. при клике на следующий элемент новой вкладки не открывается - и как следствие, метод Close() вызывается на основной странице.

Проблемы с тем, что открывается более двух вкладок не замечено.

DriverManager.Driver.Navigate().GoToUrl("https://google.com");
            var allLinks = DriverManager.Driver.FindElements(By.TagName("a")).ToList();

            allLinks.ForEach(link =>
            {
                DriverManager.Driver.Actions().KeyDown(Keys.Control).Click(link).KeyUp(Keys.Control).Perform();
                DriverManager.Driver.SwitchTo().Window(DriverManager.Driver.WindowHandles.Last());
                DriverManager.Driver.WaitForPageLoad();
                DriverManager.Driver.Close();
                DriverManager.Driver.SwitchTo().Window(DriverManager.Driver.WindowHandles.First());
                DriverManager.Driver.WaitForPageLoad();
            });

Ну и да, слипы - зло.

Лучше уж так.

public static void WaitForPageLoad(this IWebDriver driver)
        {
            driver.Wait().Until(() => driver.ExecuteJavaScript<string>("return document.readyState") == "complete");
        }

(sakredit) #3

А почему слипы зло,я их использовал,чтобы понять в чем ошибка.А еще скажите,для чего вы используете DriverManager?Я вроде разобрался в чем у меня ошибка,это из за класса Action,без него использовал сочетание клавиш ctrl+enter и все заработало,как я и хотел.Но не понятно почему себя так action введет


(Alexandr D ) #4

DriverManager - это фабрика драйверов. Создание/удаление/использование драйвера происходит через неё.
Ну и конечно же методы расширения - очень замечательная вещь.

Слипы зло - потому что потом вы забудете их убрать и будете каждый раз ждать фиксированное время.
Чтобы понять в чём ошибка, можно использовать пошаговый дебаг, проваливаясь всюду, куда надо.


(Ihor Kokhan) #5

А зачем открывать новую вкладку а потом ее закрывать?

[FindsBy(How = How.XPath, Using = "//nav[@class='menu']//a[@href]")]
private IList<IWebElement> _menuItems;

public List<string> GetAllMenuUrls()
{
    return _menuItems.Select(item => item.GetAttribute("href")).ToList();
}

[Test]
public void MenuNavigationTest()
{
    var menuItemsUrls = new NavigationMenu(Driver).GetAllMenuUrls();
    var waiter = new Waiter(Driver, waittime);
    foreach (var url in menuItemsUrls)
    {
        Driver.Navigate().GoToUrl(url);
        waiter.WaitForPageLoad();
        Assert.AreEqual(url, Driver.Url);
    }
}

У нас так реализовано


(Alexandr D ) #6

Вы у меня спрашиваете? Не знаю, это ТС так хочет. :slight_smile:


(Ihor Kokhan) #7

Сорри, не на того кликнул “Ответить” :grinning:
Но думаю автор увидит


(Dmytro Kryshtopenko) #8

Две вещи которые вы должны для себя заинвестигировать:

  1. selenium expected conditions (для тонкого ожидания чего-угодной через webdriverWait или fluentWait и подобное с умными таймаутами)
  2. И dataprovider для того же JUnit для параметризированных тестов. (т.к. уместнее делать тест на проверку определенной урлы, так в случае FAILED/BLOCKED во время исполнения будет выполнятся тест со следующих входным параметром - новой независимой урлой которой вам нужно протестировать на респонс и т.д.)