Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Repo info
Activity
  • Jul 19 21:10

    asolntsev on gh-pages

    publish Selenide 5.23.0 release… (compare)

  • Jul 18 07:33

    asolntsev on gh-pages

    add StaticConfig/StaticDriver n… (compare)

  • Jul 17 21:30

    asolntsev on gh-pages

    add imports for clarity (compare)

  • Jul 17 21:12

    asolntsev on gh-pages

    publish Selenide 5.23.0 release… (compare)

  • Jul 05 15:16

    asolntsev on gh-pages

    publish Selenide 5.22.3 release… (compare)

  • Jun 30 06:44

    asolntsev on gh-pages

    release Selenide 5.22.2 with a … (compare)

  • Jun 28 13:01

    asolntsev on gh-pages

    update information about suppor… (compare)

  • Jun 18 11:11

    asolntsev on gh-pages

    released Selenide 5.22.1 (compare)

  • Jun 12 19:23

    asolntsev on gh-pages

    publish Selenide 5.22.0 release… (compare)

  • Jun 10 10:42

    asolntsev on gh-pages

    publish Selenide 5.22.0 release… (compare)

  • Jun 02 15:25

    asolntsev on gh-pages

    the historical moment: disable … (compare)

  • May 19 21:06

    asolntsev on gh-pages

    Update faq.md Fix typo (compare)

  • May 17 17:12

    asolntsev on gh-pages

    publish release notes for Selen… (compare)

  • May 16 19:20

    asolntsev on gh-pages

    upgrade kramdown to 2.3.1 which… (compare)

  • May 16 13:44

    asolntsev on gh-pages

    publish release notes for Selen… (compare)

  • Apr 22 16:37

    asolntsev on gh-pages

    released Selenide 5.20.4 (compare)

  • Apr 20 17:11

    asolntsev on gh-pages

    released Selenide 5.20.3 (compare)

  • Apr 15 21:46

    asolntsev on gh-pages

    upgrade to Selenide 5.20.2 (compare)

  • Apr 02 06:57

    asolntsev on gh-pages

    Update 2019-12-10-advent-calend… Merge pull request #15 from sva… (compare)

  • Apr 02 06:57
    asolntsev closed #15
Boris Osipov
@BorisOsipov
с другой стороны в wdio давно это есть и вроде не сильно народ жалуется
если кому-то интересно в вдио вот реализация
(учитывайте что там много селекторов не для веба)
Oleksii Cherevatyi
@JustAlexOne

если кому-то интересно в вдио вот реализация

интересно, то есть они считают xpath-ом только два слеша?

Boris Osipov
@BorisOsipov
нет конечно
const XPATH_SELECTORS_START = [ '/', '(', '../', './', '*/' ]
Oleksii Cherevatyi
@JustAlexOne
а, всё, увидел
Boris Osipov
@BorisOsipov
ага. мне казалось раньше была регулярка)
Oleksii Cherevatyi
@JustAlexOne
Подскажите, в чём может быть проблема - форкнул selenide проект, склонил, ничего не менял, запускаю integration тесты, около 40% падают. Падают, как я и подозревал - с включённым прокси - вопрос - что не так?
Andrei Solntsev
@asolntsev
Ясновидцев нет. С какой ошибкой хоть падают?
Oleksii Cherevatyi
@JustAlexOne
Да, сорри
image.png
СТраница не открывается на всех тестах
Oleksii Cherevatyi
@JustAlexOne
Я так понимаю, у меня проблема, которая обсуждалась здесь - https://automated-testing.info/t/browsermob-proxy-java-webdriver-pomogite-zapustit-prostejshij-test/4531/8
Но там решения нет )
Andrei Solntsev
@asolntsev
@JustAlexOne Не уверен, что там та же проблема. Похоже, на твоём компе резолвится имя хоста какое-то неправильное. Попробуй задать -Dselenide.proxyHost=127.0.0.1
Oleksii Cherevatyi
@JustAlexOne
Попробовал, спасибо, но не помогло
Denis Gaievskyi
@dengayevskiy-sb
Привет! Я использую прокси Сonfiguration.fileDownload = FileDownloadMode.PROXY для скачивания файлов. Решил попробовать запускать selenide тесты вместе с test-containers. Для этого, насколько я понял, необходимо поднять прокси самому и передать его в WebDriverRunner. Вопрос -> какую конфигурацию селенид хочет в конструктор прокси? SelenideProxyServer proxyServer = new SelenideProxyServer(Configuration?, null);
Если я передаю туда new SelenideConfig(), то вся конфигурация, которая выставляется в @BeforeEach, например, Configuration.timeout = globalTimeout игнорируется.
Denis Gaievskyi
@dengayevskiy-sb
@JustAlexOne нам помогло Configuration.proxyHost = "0.0.0.0";
Andrei Solntsev
@asolntsev
@dengayevskiy-sb для того, чтобы использовать TestContainers, вовсе необязательно самому создавать вебдрайвер и дергать WebDriverRunner. Тут рабочий пример: https://github.com/selenide-examples/testcontainers
Denis Gaievskyi
@dengayevskiy-sb

@asolntsev Я этими примерами как раз и пользовался. Там каждый тест в @Before достает вебдрайвер из контейнера и передает в селенидовский вебдрайвер ранер.

  @Rule
  public BrowserWebDriverContainer chrome =
      new BrowserWebDriverContainer()
          .withCapabilities(DesiredCapabilities.chrome());

  @Before
  public void setUp() {
    RemoteWebDriver driver = chrome.getWebDriver();
    WebDriverRunner.setWebDriver(driver);

А я должен передать еще и прокси в WebDriverRunner -> WebDriverRunner.setWebDriver(driver, proxyServer);

Oleksii Cherevatyi
@JustAlexOne

@JustAlexOne Не уверен, что там та же проблема. Похоже, на твоём компе резолвится имя хоста какое-то неправильное. Попробуй задать -Dselenide.proxyHost=127.0.0.1

@JustAlexOne нам помогло Configuration.proxyHost = "0.0.0.0";

Я подразобрался с ситуацией.
Во-первых, после рекомендации Андрея, я неправильно проставил proxyHost и получил ложный негативный результат - поскольку подставлял proxyHost=127.0.0.1 через системную пропертю, но это значение перед тестом всё равно перетирается на пустую строку в integration.IntegrationTest#resetSettings(). Потом я всё-таки докопался и обнаружил, что да - простановка proxyHost=127.0.0.1 или localhost, или 0.0.0.0 - помогает.
Решил копнуть глубже. Поднял убунту виртуалку, запустил тест там - там proxyHost проставлять не нужно - тесты работают сразу, прокся подымается и запросы идут через неё. Копаем дальше.
Докопался вот до такого метода в browserup-proxy, который "пытается" зарезолвить имя хоста для простановки будущему прокси серверу:

    /**
     * Attempts to retrieve a "connectable" address for this device that other devices on the network can use to connect to a local proxy.
     * This is a "reasonable guess" that is suitable in many (but not all) common scenarios.
     * TODO: define the algorithm used to discover a "connectable" local host
     *
     * @return a "reasonable guess" at an address that can be used by other machines on the network to reach this host
     */
    public static InetAddress getConnectableAddress() {
        try {
            return InetAddress.getLocalHost();
        } catch (UnknownHostException e) {
            throw new RuntimeException("Could not resolve localhost", e);
        }
    }

По сути, тут ничего такого, чисто java.net.* код
На моём компе, этот код возвращает hostname машины, что-то вроде 'alex-macbook'. Потом результат этого метода передаётся в метод com.browserup.bup.client.ClientUtil#createSeleniumProxy()
и на этом адресе стартует прокся, что-то типа http://alex-macbook:65743 - в таком варианте, браузер не достукивается до прокси и я вижу сообщение "No Internet", про что я писал ранее.
Копаю дальше.
Выясняется, что вот этот хостнейм 'alex-macbook' не замаплен на локалхост в /etc/hosts.
После добавиления строки 127.0.0.1 localhost alex-macbook в файл /etc/hosts - всё заработало и без проставления proxyHost в селенид

Oleksii Cherevatyi
@JustAlexOne
И теперь остаётся вопрос - что с этим всем делать?
Снаружи выглядит как-будто селенидовская прокся не работает. По факту - "недонастройка" операционной системы - если это можно так назвать. Я не знаю когда и при каких условиях хостнейм машины должен попадать в маппинг в файле /etc/hosts.
Мне видятся такие варианты:
1) Написать не это дело какой-то интеграционный тест в селениде? - пока не придумал какой
2) На стороне селенида - перед стартом прокси, парсить содержимое файла /etc/hosts и предупреждать пользователя если мапинг не найден? Не знаю, работать будет, но надо ли?
3) Всегда стартовать проксю на локалхосте и не резолвить хостнейм вообще? - тоже не знаю, может ли у кого-то прокся быть не на локалхосте
4) Задокументировать, так сказать для тех, кто столкнётся с таким же
5) Ничего не делать :)
@asolntsev
velios
@velios
Доброго времени суток. Возможно ли Command<> сделать для ElementsCollection? Для использования например elementColl.execute(customChechSize(2)) по аналогии с Command<> для SelenideElement
Andrei Solntsev
@asolntsev
@JustAlexOne крутое расследование! Я в своё время похожую багу в селениум зарепортил: SeleniumHQ/selenium#489
И ещё такую: SeleniumHQ/selenium#3048
@JustAlexOne и похоже, что этот фикс в селениуме исправил проблему: SeleniumHQ/selenium@f0f8def
Andrei Solntsev
@asolntsev
@velios сейчас такого нет. Наверное, можно сделать. Но как-то пока не просил никто.
Andrei Solntsev
@asolntsev
@velios погоди-ка, я что-то туплю. Ведь тебе нужно не действие с коллекцией, а проверка, так? Тогда просто вызови $$().shouldHave(new ТвойCollectionCondition())
Denis Gaievskyi
@dengayevskiy-sb
@asolntsev кое как запустил тесты в контейнере, но скачивание через прокси по прежнему не работает :/ Похоже, я плохо понимаю механизм его работы. Если мне нужен вебдрайвер из контейнера, я должен сам создать и стартонуть селенид прокси?
    SelenideProxyServer proxyServer;

    @Container
    public BrowserWebDriverContainer chrome =
            new BrowserWebDriverContainer()
                    .withCapabilities(new ChromeOptions());

    @BeforeEach
    public void before() {
        SelenideConfig defaults = new SelenideConfig();
        proxyServer = new SelenideProxyServer(defaults, null);
        RemoteWebDriver driver = chrome.getWebDriver();
        WebDriverRunner.setWebDriver(driver, proxyServer);
        proxyServer.start();

        Configuration.timeout = globalTimeout;
        Configuration.baseUrl = collab_url;
        Configuration.fileDownload = FileDownloadMode.PROXY;
        Configuration.proxyEnabled = true;
        Configuration.proxyHost = "0.0.0.0";
        Configuration.fastSetValue = true;
        Configuration.startMaximized = true;
    }
velios
@velios
@asolntsev Если есть возможность расскажите, когда проверяем лямбдами коллекцию, то для CollectionContition'ов allMatch, anyMatch, noneMatch, то как Predicate используется WebElement из Selenium, а не SelenideElement? Интересно почему так сделано?
@CheckReturnValue
    public static CollectionCondition allMatch(String description, Predicate<WebElement> predicate) {
        return new AllMatch(description, predicate);
 }
velios
@velios

Приведу примеры, может я не правильно это все использую просто. Сейчас пишу проверку так

trs.shouldBe(allMatch("all value same in column",
                    e -> e.findElements(By.tagName("td")).get(i).getText().equals(cellValue)));

если бы был SelenideElement представляю можно было писать так

trs.shouldBe(allMatch("all value same in column",
                    e -> e.findAll("td").get(i).has(text(cellValue));

Не то чтобы разница большая в моем примере, но некоторых возможностей в WebElement вообще нет, и выглядит имхо лаконичнее

Oleksii Cherevatyi
@JustAlexOne

@JustAlexOne крутое расследование! Я в своё время похожую багу в селениум зарепортил: SeleniumHQ/selenium#489

@asolntsev ага, я тоже на стековерфлоу видел у людей проблемы были с медленным резолвом хостнейма. Я так понимаю, на стороне селенида ничего не нужно делать?

Andrei Solntsev
@asolntsev
@JustAlexOne Наверное, мы могли бы взять тот же фикс, что Баранцев сделал в селениеме, и запихать его в селенид или browserup-proxy.

@dengayevskiy-sb Боюсь, так просто не получится. Чтобы браузер использовал прокси, надо ему при создании вебдрайвера задать соответствующую опцию (типа options.setProxy(selenideProxy.createSeleniumProxy());).

Если же браузер изначально создан внутри TestContainers, он ничего про селенидовский прокси знать не может.

Andrei Solntsev
@asolntsev
@JustAlexOne Может удастся задать селенидовский прокси через capabilities? Как-то так:
  @Rule
  public BrowserWebDriverContainer chrome =
      new BrowserWebDriverContainer()
          .withCapabilities(как-то здесь задать свой прокси)
          .withRecordingMode(BrowserWebDriverContainer.VncRecordingMode.RECORD_ALL, new File("build"))
          .withCapabilities(DesiredCapabilities.chrome());
@JustAlexOne А вообще, я подумаю сделать (как минимум для хрома) третий способ скачивания файлов: не через прокси, а через CDP. Это по идее должно решить проблему.
@velios Вся фишка селенидовских проверок в том, что они могут подождать.
Если в allMatch (как и в других CollectionCondition) дать доступ к SelenideElement, люди смогут вызывать селенидовские методы типа .shouldHave(…), и тогда получится странная ситуация: внутри “ожидающего” метода allMatch будут в цикле вызываться другие “ожидающие” методы shouldHave. Сложно и непредсказуемо.
Andrei Solntsev
@asolntsev
@velios А может быть, ты расскажешь, каких именно методов не хватает в WebElement? Просто has(text())) действительно не очень много.
Denis Gaievskyi
@dengayevskiy-sb
@asolntsev то есть, нет возможности использовать прокси селенида для скачивания и тест контейнеры :(
Andrei Solntsev
@asolntsev
@dengayevskiy-sb Секунду, эту опцию пробовали?
@Rule
  public BrowserWebDriverContainer chrome =
      new BrowserWebDriverContainer()
          .withCapabilities(как-то здесь задать свой прокси)
Denis Gaievskyi
@dengayevskiy-sb

@asolntsev попробовал

SelenideProxyServer proxyServer = getProxy();

    public SelenideProxyServer getProxy() {
        SelenideConfig defaults = new SelenideConfig();
        defaults.baseUrl(collab_url);
        defaults.proxyEnabled(true);
        defaults.fileDownload(FileDownloadMode.PROXY);
        defaults.proxyHost("127.0.0.1");
        defaults.proxyPort(8888);
        return proxyServer = new SelenideProxyServer(defaults, null);
    }

    @Container
    public BrowserWebDriverContainer chrome =
            new BrowserWebDriverContainer()
                    .withCapabilities(new ChromeOptions().setProxy(proxyServer.createSeleniumProxy()));

    @BeforeEach
    public void before() {
        proxyServer.start();
        RemoteWebDriver driver = chrome.getWebDriver();
        WebDriverRunner.setWebDriver(driver, proxyServer);

        Configuration.baseUrl = collab_url;
        Configuration.fileDownload = FileDownloadMode.PROXY;
        Configuration.proxyEnabled = true;
        Configuration.proxyHost = "127.0.0.1";
        Configuration.proxyPort = 8888;
        sessionApi.createAdmin();
    }

Теперь стало падать раньше по тесту на попытке засетить куки -> org.openqa.selenium.InvalidCookieDomainException: invalid cookie domain

velios
@velios

@velios А может быть, ты расскажешь, каких именно методов не хватает в WebElement? Просто has(text())) действительно не очень много.

Методов для навигации. Мы например используем такую штуку для выставления стилей компонентам https://github.com/Jarzka/stylefy Она добавляет всем классам рандомную каждый раз изменяющуюся часть. Приходится искать вложенные элементы через e.find("[class*='<class-part>']"). В webelement так нельзя насколько мне известно. Те же методы поиска оборачиваются в execute блоки. В webelement так нельзя. pseudo-элементы и вот это все.

Методов для проверки. Те же Condition. or, and, not блоки и прочее, что есть в SelenideElement

  • уже по мелочи, некрасиво что в коде смешиваются разные синтаксисы selenium'а и selenide
Denis Gaievskyi
@dengayevskiy-sb
image.png
@asolntsev убрал сеттинг кук, чтобы увидеть реальную ошибку
Andrei Solntsev
@asolntsev
@dengayevskiy-sb Думаю, что айпишник 127.0.0.1 не подходит для прокси. Ведь браузер бежит внутри контейнера, и для него это свой собственный адрес, а не адрес машины с тестами.
Нужно прописать другой айпишник - вроде бы в докере есть какой-то специальный апйпишник, под который контейнеру видна хостовая машина.
Andrei Solntsev
@asolntsev
@velios А ты в курсе, что WebElement очень просто легко превратить в SelenideElement? Это ведь решит твою проблему, так?
SelenideElement se = $(webElement);
@velios Я завёт тикет для обсуждения: selenide/selenide#1135