Задать вопрос
@SolomonVP
I study JavaEE

Как подсчитать письма с помощью Selenium/Java?

Пришел тестовый таск недели две назад. Зачем оно мне пришел я не понял, поэтому долго времени не терял, часика 2 посидел и не ответил на него. В общем отказался.
Необходимо было использовать Selenium, о котором я первый раз услышал. Открыть почту, посчитать письма, закрыть почту.
В общем чтобы отвлечься от учебы решил просто попробовать его одолеть, и уже вторую ночь сижу и не пойму...
Как посчитать письма в почтовом ящике по теме письма. Вывод был либо 0(ноль), либо 1, либо ничего. Докопался даже до разработчика шарпа, он даже скинул мне свой код, где у него всё получилось и всё считалось. Вот только у него метод .Count, а у меня должен быть я так понимаю .size(). И не получается.
Все 20 попыток решить вопрос не буду скидывать, вот последний вариант(по аналогу с помощником от шарп)... (извините за кривой xPath, нет времени разбираться, да и вряд ли понадобится в ближайшем будущем).
Собственно сам код по подсчету(после входа в ящик):
driver.findElement(By.xpath("//*[@id=\"js-apps-container\"]/div[2]/div[8]/div/div[2]/div/div/div[1]/div[2]/div/div/div/div[1]/form/div/span/input")).click();
        driver.findElement(By.xpath("//button[@title='расширенный поиск']")).click();
        var el = driver.findElement(By.xpath("//span[text()='Ещё']"));
        el.findElement(By.xpath("./..")).findElement(By.xpath("./..")).click();
        el = driver.findElement(By.xpath("//span[text()='В теме письма']"));
        el.findElement(By.xpath("./..")).findElement(By.xpath("./..")).click();
        driver.findElement(By.xpath("//*[@id=\"js-apps-container\"]/div[2]/div[8]/div/div[2]/div/div/div[1]/div[2]/div/div/div/div[1]/form/div/span/input")).click();
        driver.findElement(By.xpath("//*[@id=\"js-apps-container\"]/div[2]/div[8]/div/div[2]/div/div/div[1]/div[2]/div/div/div/div[1]/form/div/span/input")).sendKeys("Тема письма");
        el = driver.findElement(By.xpath("//span[text()='Найти']"));
        el = el.findElement(By.xpath("./.."));
        el.click();
        var count = driver.findElements(By.xpath("//span[@title='Тема письма']")).size();
        System.out.println(count);
  • Вопрос задан
  • 162 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
rstJkee
@rstJkee
Извини, что абстрактно, потому что код бы всё равно невероятно сильно отличался, так как я последний раз на селениуме работал в питоне

1. Так как почта скорее всего построена на фреймворке (react/vue/angular), то она строит элементы динамически, следовательно твоим 1 шагом должно быть то, что ты в драйвере должен выставить некоторый wait/until. То есть ты должен подождать, пока прогрузится страница
// Ждём, пока не будет элемента с name = q
WebElement foo = new WebDriverWait(driver, Duration.ofSeconds(3))
          .until(driver -> driver.findElement(By.name("q")));

2. Так как ты подождал загрузку в первом пункте, то тебе можно отказаться от xpath`ов и пользоваться нормальными селекторами (https://www.selenium.dev/documentation/webdriver/l...). Собственно, можно и с ними, но в почте множество повторяющихся элементов с одинаковыми классами => брать их через xpath - очень больно, так как у них у всех xpath будет разный, а => выстроить динамику в цикле будет трудно
3. Через эти селекторы ты уже сможешь получать всю информацию на странице, которую можно обходить в цикле/сортировать/фильтровать и прочее (там уже и stream api джависткий можно юзать и прочее, и прочее)
Ответ написан
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Добрый день.
Ну ответ на ваш вопрос может сильно отличаться от почтового провайдера к почтовому провайдеру, ибо у них разный DOM и соответственно, будут нужны разные селекторы (xpath).
Если простыми словами, то:
- открыть браузер (можно в headless режиме)
- найти узел, в котором представлен список писем
- выбрать этот узел. В Selenium есть такой класс, как WebElement. Так как элементов несколько, то используйте List<WebElement>.
- Так как у нас есть List вызываем метод size() и получаем кол-во элементов помещенных в список.

И как правильно отметил коллега rst надо заставить подождать загрузки страницы. Прочитайте про Explicit & Implicit Waits
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы