Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Selenide ElementsCollection (не работает .click)

selenide
selenium
java
Теги: #<Tag:0x00007f7b63995418> #<Tag:0x00007f7b639952d8> #<Tag:0x00007f7b63995198>

(Alex) #1

Всем здравствуйте!
Столкнулся с тем, что ElementsCollection из Selenide не хочет кликать по элементам из коллекции.
Метод с классическим Selenium отрабатывает все на ура. В чем может быть причина?
Выдает стандартное: java.lang.NullPointerException

@FindBy(className = "checkbox__label") ElementsCollection checkBoxes;
public void choose5and9checkBoxes(){
        priceFromSelenide.get(5).click();
        priceFromSelenide.get(9).click();
    }

// Классика от Selenium:
 public void choose5and9checkBoxes( WebDriver driver){
        driver.findElements(By.className("checkbox__label")).get(5).click();
        driver.findElements(By.className("checkbox__label")).get(9).click();
    }

(Sergey Pirogov) #2

а ты вызываешь PageFactory.initElements(driver, page)?
Когда ты используешь @FindBy вызов этого метода обязателен. Ну или в случае selenide нужно вызывать метод page(class)

class Page{
@FindBy(className = "checkbox__label") ElementsCollection checkBoxes;
public void choose5and9checkBoxes(){
        priceFromSelenide.get(5).click();
        priceFromSelenide.get(9).click();
    }
}

Page page = Selenide.page(Page.class) 

И тогда наступит вам счастье


(Alex) #3

У меня есть экземпляр на странице с шагами, но объявлен как pagefactory.
Не уж то надо именно селенидовский создавать?

MainPage mainPage = PageFactory.initElements(driver, MainPage.class);

(Alex) #4

Все, разобрался. Большое спасибо. Все работает


(Roma Marinsky) #5

А ещё лучше не используй фабрику и ленивую инициализацию. Селенидовские элементы проксирующие, к ним обращение на манипуляцию происзходить при вызоме методов манипуляций или ожиданий.
SenenideElement button = $("#button"); создаст просто прокси элемент в памяти - он не будет искаться в браузере.
И потом для инициализации pageObject’a просто пиши new MyCoolObject(); как к простому объекту, без всяких page(MyCoolObject.class);


(Alex) #6

Большое спасибо, учту. Подскажите еще пожалуйста, если не трудно, как в Selenide Chrome запустить?
Положил Chromedriver в корень проекта.
Вот такая конструкция пока не помогает(

  @BeforeTest
    public void beforeTest() {
        Configuration.timeout=5000;
        System.setProperty("webdriver.chrome.driver", "chromedriver");
    }

(Dmitrii Demin) #7

-Dbrowser=chrome


(Alex) #8

К сожалению, из командной строки я не запускаю. Я бы хотел увидеть пример кода из теста, если можно.
очень странно, что в инете почти нет информации по этому поводу.
Вот так тоже не работает:

System.setProperty("selenide.browser", System.setProperty("browser", CHROME));

(Dmitrii Demin) #9

Configuration.browser = “chrome”;


(Alex) #10

Тоже не помогает. Видимо, Selenide больше с Хромом не работает :laughing:


(Dmitrii Demin) #11

Что в консоли? Хром вообще установлен? Какая версия браузера и драйвера?
Экстрасенсов тут нет)


(Eugene Moskalenko) #12

Ну если вы положили в корень проекта chrome driver, то вроде как надо путь к нему казать:

System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
System.setProperty("selenide.browser", "chrome");
open("http://google.com");
$(By.name("q")).setValue("Selenide").pressEnter();

и вроде как подключить его надо в самом начале @BeforeSuite, я себе сделал так, в BaseTest (два метода):

    @BeforeSuite(alwaysRun = true)
    public void setUp() {
        setWebDriver(getDriver());
    }
    /**
     * Returns the webdriver object for that given thread
     * @return - WebDriver object
     */
    public static WebDriver getDriver() {
        return WebDriverRunner.getWebDriver();
    }

в pom.xml

    <properties>
        <!-- Default browser-->
        <browser>chrome</browser>
    </properties>

   <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${maven-surefire-plugin.version}</version>
                <configuration>
                    <systemPropertyVariables>
                        <browser>${browser}</browser>
                    </systemPropertyVariables>
                </configuration>
            </plugin>
   </plugins>

в будущем можете с таким подходом создать профили в pom.xml и запускать браузеры через профили, добавив в pom.xml такое:

    <profiles>
        <profile>
            <id>firefox</id>
            <properties>
                <browser>firefox</browser>
            </properties>
        </profile>
        <profile>
            <id>chrome</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <browser>chrome</browser>
            </properties>
        </profile>
        <profile>
            <id>phantomjs</id>
            <properties>
                <browser>phantomjs</browser>
            </properties>
        </profile>
        <profile>
            <id>ie</id>
            <properties>
                <browser>ie</browser>
            </properties>
        </profile>
        <!--<profile>-->
            <!--<id>safari</id>-->
            <!--<properties>-->
                <!--<browser>safari</browser>-->
            <!--</properties>-->
            <!--<dependencies>-->
                <!--<dependency>-->
                    <!--<groupId>org.seleniumhq.selenium</groupId>-->
                    <!--<artifactId>selenium-safari-driver</artifactId>-->
                    <!--<version>${selenium.version}</version>-->
                <!--</dependency>-->
            <!--</dependencies>-->
        <!--</profile>-->
        <profile>
            <id>htmlunit</id>
            <properties>
                <browser>htmlunit</browser>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>org.seleniumhq.selenium</groupId>
                    <artifactId>selenium-htmlunit-driver</artifactId>
                    <version>LATEST</version>
                    <scope>test</scope>
                </dependency>
            </dependencies>
        </profile>
        <profile>
            <id>local</id>
            <properties>
                <holdBrowserOpen>true</holdBrowserOpen>
            </properties>
        </profile>
    </profiles>

(Roma Marinsky) #13

В бифорСьют или в бифорКласс:

System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
Configuration.browser = WebDriverRunner.CHROME;

Или
в депенденси добавь: io.github.bonigarcia:webdrivermanager:1.5.0

В бифорСьют или в бифорКласс:

Configuration.browser = WebDriverRunner.CHROME;
ChromeDriverManager.getInstance().setup();

(Alex) #14
    @BeforeTest
    public void beforeTest() {
        System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
        Configuration.browser = WebDriverRunner.CHROME;
        Configuration.timeout=5000;
    }

Такая конструкция у меня не работает


(Alex) #15

Я думаю, вся проблема в том, что на Mac запускаю. Постоянно тут с путями рамс какой-то.

POM:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>testYandexMarket</groupId>
    <artifactId>alexander</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-firefox-driver</artifactId>
            <version>2.53.1</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-chrome-driver</artifactId>
            <version>2.53.1</version>
        </dependency>
        <dependency>
            <groupId>ru.yandex.qatools.allure</groupId>
            <artifactId>allure-maven-plugin</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>ru.yandex.qatools.allure</groupId>
            <artifactId>allure-java-annotations</artifactId>
            <version>1.4.20</version>
        </dependency>
        <dependency>
            <groupId>com.codeborne</groupId>
            <artifactId>selenide</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.9.10</version>
        </dependency>
    </dependencies>
</project>

(Sergey Pirogov) #16

вся проблема обычно в голове =)


(Alex) #17

Не отрицаю) Более того, предполагаю, что у меня руки растут из одного места)))
Однако, от осознания этого легче не становится и Хром не запускается :joy:
Можно было бы просто одну строчку менять - и раз, вуаля. А тут такие танцы с бубнами приходится наворачивать.


(Roma Marinsky) #18

У тебя окно браузера открывается? Если нет - значит скорее всего путь не правильный.
И лог выложи сюда, что возникает при запуске тестов и инициализации драйвера

И конфигурации для браузера лучше описывать в статическом методе с аннотацией BeforeSuite типа или класс
И кстати, переименуй хотя бы BeforeTest на BeforeMethod. Помню что-то было с этой разницой


(Alex) #19

Дело в том, что у меня все прекрасно открывается и ничего не крашится. Просто тест сразу запускается и открывается в FireFox. Любые потуги с изменением дефолтных настроек Selenide не приводят к успеху.

У меня есть класс: BaseStep. В нем лежит метод:

public void openYandex() {
Selenide.open("http://www.yandex.ru")
}

Потом вот так:

public class MainSteps extends BaseStep {

    YandexMarketPage marketPage = Selenide.page(YandexMarketPage.class);

    @Step("Open Yandex ")
    public MainSteps openYandexPage(){
        super.openYandex();
        return this;
    }

Ну а в самом тесте только шаги


(Roma Marinsky) #20

YandexMarketPage marketPage = Selenide.page(YandexMarketPage.class);
Перемести в тест и всё заработает