[Resolved] Селениум - кликает на не нужные (не определённые) кнопки/вкладки сайта

Есть классы:

public class ContainerMainMethods {  }

здесь описана инициализация вебдрайвера и главные методы типа: кликнуть на определённые элементы страницы, ввести в поле ввода, ожидание появления элемента

public class ContainerForSecond_Page extends ContainerMainMethods { }

здесь описаны методы по работе с блоками страницы, используя методы от класса “ContainerMainMethods”

public class ContainerForTrird_Page extends ContainerMainMethods {  }

здесь описаны методы по работе с блоками страницы, используя методы от класса “ContainerMainMethods”

public class StartCreation extends ContainerMainMethods {  }

В этом классе описана последовательность выполнения требуемого сценария

public class First_Page extends ContainerMainMethods {}
public class Second_Page extends ContainerForSecond_Page  {}
public class Third_Page extends ContainerForThird_Page {}

В этих классах используются методы из контейнеров для выполнения заданных сценариев в определённой последовательности

Суть проблемы: Первую страницу тест проходит положительно, всё нормально кликается, всё нормально заполняется. Затем вызывается класс “Second_Page” использующий методы класса “ContainerForSecond_Page” и возникают проблемы с кликами по объектам сайта (buttons, radio buttons, checkboxes), после нескольких кликов на странице, происходит клик на главные вкладки сайта (любую из вкладок) - хотя я не описывал эти действия.

Мои методы:

public class ContainerMainMethods {
public static void setUp() throws Exception{
    DesiredCapabilities capabilities = DesiredCapabilities.firefox();
    capabilities.setJavascriptEnabled(true);
    driver = new FirefoxDriver(capabilities);
    driver.get("http://trafficapp.softproject.com.ua/");
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
}
    protected static void clickOn(String selectId) { //все методы статические
            driver.findElement(By.id(selectId)).click();
    }
    protected static void fillField (String idField, String valueField) {
        driver.findElement(By.name(idField)).clear();
        driver.findElement(By.id(idField)).sendKeys(valueField);
    }

Эти и другие методы использую в следующих классах:

public class ContainerForAdGroup_Page extends ContainerMainMethods {

    public static void choiceAdGroupType() throws Exception { //все методы статические
            int typeOfAdGroupType = (int) (Math.random() * 1);

            if (typeOfAdGroupType == 0) { //choice PPR or CPC
                clickOn("ct" + typeOfAdGroupType); //choice PPR
            } else clickOn("ct" + typeOfAdGroupType); //choice CPC
    }

    public  static void choiceTypeOfTraffic() throws Exception{
        int idOfTraffic = (int) (Math.random() * 4); //By keyword, By Category, By RON, By Domain ID
        clickOn("traf_key_" + 1);
    }

**public static void choiceCountries() throws Exception{**
        int amountOfCountries = (int) (Math.random() * 215); //amount for select Countries
           for (int iteration = 0; iteration < amountOfCountries; iteration++) //choice countries
           {    System.out.print("ok");
               int numberOfCountry = (int) (Math.random() * 215 + 1);
               clickOnXpath("/html/body/div/div[1]/div/div/...[" + numberOfCountry + "]"); // все страны прокликиваются/выбираются
           } //затем
        clickOn("add_countries_btn"); //клик по этой кнопке не происходит, происходит магия - происходит клик на одну из главных вкладок страницы, затем происходит поиск соответствующей кнопки, но она не может быть найдена, т.к. страница уже поменялась

Последующие методы не выполняются, т.к. страница поменялась

Пробовал не использовать описанные мной методы (клик, заполнить) - всё равно кликаются не нужные вкладки.

Возможно коряво описал. Могу скинуть весь код

public class StartCreateCampaigns extends ContainerMainMethods {
    NewCampaign_Page firstStep = new NewCampaign_Page();
    Second_Page secondStep = new Second_Page();
    Third_Page thirdStep = new Third_Page();

    @Test
    public void startCreation() throws Exception {
        setUp();
        clickOnTab("login");
        fillField("email", "asd@asd.asd");
        fillField("password", "111111");
        loginOnSite();
        clickOnTab("New Campaign");
        firstStep.createNewCampaign();
        secondStep.createNewAdGroup();
        thirdStep.addTargets();
        fourthStep.finishAction();
    }
}

Это класс вызывающий методы используемые на соответствующей странице

public class Second_Page extends ContainerSecond_Page {

    public static void createNewAdGroup() throws Exception {

        fillField("group_name", "Ad Group name"); //выполняется
        fillField("dest_url", "asjfkhaskjhf237.jsdf"); //выполняется
        choiceAdGroupType(); //выполняется
        choiceTypeOfTraffic(); //выполняется
        choiceCountries(); //выполняется, после клика в этом методе - происходит клик не туда куда нужно - либо на главною страницу, либо на первую страницу, либо на несуществующую страницу
        choiceManufacturersAndOSs(); //тут при попытке кликнуть на нужный объект, отображается ошибка - что нет элемента на этой странице. Ну понятно, потому что уже вооще левая страница... какого чёрта :(
        choiceBrowsers();
        choiceIncludeAdult();
        choiceCustomDayPartying();
        fillFrequencyCapFiled();
        fillMaxAvgDefaultBid();
        choiceDailySpendLimitAndFillValue();
    }

Просматривал код сайта, множество тегов имеют одинаковые наименования классов, опций, и прочих атрибутов

Для начала я бы почистил target и перекопилился .

там случаем “add_countries_btn” id не влеплен в два элемента . Он конечно должен типа быть уникальным .

Что самое странное, все кнопки имеют уникальный id, также и радобаттоны и чекбоксы.
Какие таргеты?

папка target c компилированнЫм кодом .

debug куда идет вот этого куда идет clickOn(“add_countries_btn”);

и вообще add_countries_btn - это какой элемент(tag) ?

button с id

Та вообще в принципе проблема с кликом на второй странице
В первых 2 методах choiceAdGroupType(); и choiceTypeOfTraffic(); кнопки кликаются. Все остальные не кликаются - кликаются заглавные вкладки сайта вместо определённых радиобаттонов, чекбоксов и кнопок. Если закоментировать те 2 метода, оставить все остальные - то всё равно не кликаются все остальные элементы ничего не выполняя кроме заполнения полей

Почистил папку, сделал ребилд - не помогло

Еще варианты

  1. Frame ?
  2. переписать не на id а что-то другое .
  1. Да, поддерживаю, попробуйте xpath вместо id
  2. Гляньте ещё тот ли метод вызывается на этой странице и правильно ли он дёргает локатор

Не корректный немного вопрос .

Но ты же это руками проверил и все работает ?

Использовал xpath - тщетно - тоже самое… Кликает не туда куда нужно
Хоть и клики по главным вкладкам вообще не описываются в классах второй страницы - но они кликаются.

Приведите пример как определить кликающийся элемент?

Я пробывал через try catch, в одном либо другом случае мне возврщал локатор в который кликать собрался.
Локатор определяется так как задано, но перед кликом в нужный локатор кликает во вкладки

Случаем нигде нет overide методов ?

Записывал тот же сценарий через селениум иде, давно, всё нормльно работало
Завтра попробую простейший какой-то сценарий прокликать без всех элементов.

Щас скину весь код

Неа, нет таких методов

webDriverWait = new WebDriverWait(webDriver, GlobalVariables.GlobalTimeOut);
webDriverWait.until(ExpectedConditions.elementToBeClickable(element));

Главный контейнер, от него все наследования

public class ContainerMainMethods {

    public static WebDriver driver;
    public ContainerMainMethods () {}
    public static void setUp() throws Exception{
        DesiredCapabilities capabilities = DesiredCapabilities.firefox();
        capabilities.setJavascriptEnabled(true);
        driver = new FirefoxDriver(capabilities);
        driver.get("http://site.com.ua/");
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
    }

    protected static void clickOnTab(String linkText) {
        driver.findElement(By.linkText(linkText)).click();
    }
    protected static void loginOnSite() {
        driver.findElement(By.cssSelector("input.btn.btn-primary")).click();
    }
    protected static void clickOn(String selectId) {
            driver.findElement(By.id(selectId)).click();
    }
    protected static void fillField (String idField, String valueField) {
        driver.findElement(By.name(idField)).clear();
        driver.findElement(By.id(idField)).sendKeys(valueField);
    }
    protected static void clickOnXpath(String xpathId) {
        System.out.println(xpathId);
        driver.findElement(By.xpath(xpathId)).click();
    }
    protected static boolean isElementPresent(By by) {
        try {
            driver.findElement(by);
            return true;
        } catch (NoSuchElementException e) {
            return false;
        }
    }

    protected static void waitElement(String idElement) throws Exception{
        for (int second = 0;; second++) {
            if (second >= 60) fail("timeout");
            try {
                if (isElementPresent(By.id(idElement))) break;
            } catch (Exception e) {
            }
            Thread.sleep(1000);
        }
}
}

Класс контроллер и запуска теста

  public class StartCreateCampaigns extends ContainerMainMethods {
        NewCampaign_Page firstStep = new NewCampaign_Page();
        AddTargets_Page thirdStep = new AddTargets_Page();
        Finish_Page fourthStep = new Finish_Page();
    
        @Test
        public void startCreation() throws Exception {
            setUp();
            clickOnTab("login");
            fillField("email", "asd@asd.asd");
            fillField("password", "111111");
            loginOnSite();
            clickOnTab("New Campaign");
            firstStep.createNewCampaign();
            AdGroup_Page.createNewAdGroup();
            thirdStep.addTargets();
            fourthStep.finishAction();
        }
    
    }

Класс со сценариями первой страницы:

public class NewCampaign_Page extends ContainerMainMethods {

    public void createNewCampaign() throws Exception {
        Integer valueOfScenario = (int) (Math.random() * 4+1);

        switch (valueOfScenario) {
            case 1:
                clickOn("daily-lim");
                fillField("daily_price_value", "100");
            case 2:
                clickOn("campaign-lim");
                fillField("campaign_price_value", "10000");
                fillField("campaign_name", "campaign name" + valueOfScenario);
                clickOn("save_btn");
                break;
            case 3:
                clickOn("daily-lim");
                fillField("daily_price_value", "200");
            case 4:
                fillField("campaign_name", "campaign name" + valueOfScenario);
                clickOn("save_btn");
                break;
        }

    }

Класс контейнер для второй страницы:

public class ContainerForAdGroup_Page extends ContainerMainMethods {


    //Click button type of Ad Group: PPR or CPC
    public static void choiceAdGroupType() throws Exception {
            int typeOfAdGroupType = (int) (Math.random() * 1);

            if (typeOfAdGroupType == 0) { //choice PPR or CPC
                clickOn("ct" + typeOfAdGroupType); //choice PPR
            } else clickOn("ct" + typeOfAdGroupType); //choice CPC
    }

    //Choice one radio button of Type of traffic: By keyword, By Category, By RON, By Domain IDs
    public  static void choiceTypeOfTraffic() throws Exception{
        int idOfTraffic = (int) (Math.random() * 4); //By keyword, By Category, By RON, By Domain ID
        clickOn("traf_key_" + idOfTraffic);
    }

    public void choiceCountries() throws Exception{

        //int amountOfCountries = (int) (Math.random() * 215); //amount for select Countries
           int iteration;
           for (iteration = 0; iteration < 5; iteration++) //choice countries
           {    System.out.print("ok");
               int numberOfCountry = (int) (Math.random() * 215 + 1);
               clickOnXpath("/html/body/div/div[1]/div/div/div[2]/form/div[7]/div/div[2]/div[1]/select/option[" + numberOfCountry + "]");
           }
        System.out.print("press");
        driver.findElement(By.id("add_countries_btn")).click();

        //System.out.print (" "+ driver.findElements(By.id("add_countries_btn")).size());
           //clickOnXpath("//*[@id=\"add_countries_btn\"]/i"); //click on "AddButton" for added countries
    }

    public static void choiceManufacturersAndOSs() throws Exception{

        System.out.print("dyrka");
        driver.findElement(By.id("device_target_1")).click();
           int amountOfOSs = (int) (Math.random() * 25); //amount for select OSs
           int amountOfManufacturers = (int) (Math.random() * 949); //amount for select Manufacturers
           //Choice device targeting

           waitElement("manufacturer_112");
           for (int iteration = 0; iteration <= amountOfOSs; iteration += 1) {
               int idOfOS = 5 + (int) (Math.random() * 25);
               clickOnXpath("(//input[@type='checkbox'])[" + idOfOS + "]");
               for (int iterationM = 0; iterationM <= amountOfManufacturers; iterationM += 1) {
                   int idOfManufacturer = (int) (Math.random() * 949);
                   waitElement("manufacturer_" + idOfManufacturer);
                   clickOn("manufacturer_" + idOfManufacturer);
               }
           }
    }

    //Choice some check boxes of Browsers
    public  static void choiceBrowsers() throws Exception {
            int amountOfBrowsers = (int) (Math.random() * 65); //amount for select Browsers

            clickOn("radioBrowsers_custom"); //choice Browsers
            for (int iteration = 0; iteration <= amountOfBrowsers; iteration += 1) {
                int idOfBrowsers = (int) +(Math.random() * 65);
                clickOn("chkBrowser" + idOfBrowsers);
            }
    }

    //Choice one radio button of Include Adult
    public  static void choiceIncludeAdult() throws Exception {
            int typeOfAdult = (int) (Math.random() * 1); //select Included Adult

            if (typeOfAdult == 1) { //choice Include adult
                clickOn("adult_yes");
            } else clickOn("adult_no");
    }

    //Choice some hours for Day Parting
    public  static void choiceCustomDayPartying() throws Exception {
            int amountOfHours = (int) (Math.random() * 24); //amount for select hours Day Partying
            clickOn("custom_day_partying"); //choice Custom day partying
            for (int iteration = 0; iteration <= amountOfHours; iteration += 1) {
                int idOfHour = (int) (Math.random() * 24);
                clickOn("select_all_" + idOfHour);
            }
    }

    //Fill Frequency Cap field
    public  static void fillFrequencyCapFiled() throws Exception {
            int valueFreqCap = (int) (Math.random() * 168 + 1);

            fillField("frequency_cap", "" + valueFreqCap); //fill value in "Frequency Cap" field
    }

    //Fill Max Avg Default Bid field
    public  static void fillMaxAvgDefaultBid () throws Exception {
            int valueForMaxAvgBid = (int) (Math.random() * 100); //

            fillField("max_avg_def_bid", "0." + valueForMaxAvgBid); //fill value in "Max Avg Default Bid" field
    }

    //Choice Daily Spend Limit and fill
    public  static void choiceDailySpendLimitAndFillValue () throws Exception {
            int typeSpendLimit = (int) (Math.random() * 1); //type of Daily Spend Limit

            if (typeSpendLimit == 1) {
                int valueSpendLimit = (int) (Math.random() * 500 + 10);
                clickOn("daily_spend_lim");
                fillField("daily_spend_val", "");
            } else clickOn("daily_spend_unlum");
            clickOn("save_btn");
    }
}

Класс контроллер для второй страницы юзающий методы из соответвствующего контейнера

public class AdGroup_Page extends ContainerForAdGroup_Page {
    static ContainerForAdGroup_Page second_Page = new ContainerForAdGroup_Page();

    public static void createNewAdGroup() throws Exception {

        fillField("group_name", "Ad Group name");
        fillField("dest_url", "asjfkhaskjhf237.jsdf");
        choiceAdGroupType(); //норм
        choiceTypeOfTraffic(); //норм

//далее переходит в этот метод, но при клике на кнопку, он кликает не туда куд надо
second_Page.choiceCountries(); //не обрщайте внимание, это просто для эксперимента
choiceManufacturersAndOSs(); //этот методы вызывается но ничего уже невозможно найти потому что не та страница
choiceBrowsers();
choiceIncludeAdult();
choiceCustomDayPartying();
fillFrequencyCapFiled();
fillMaxAvgDefaultBid();
choiceDailySpendLimitAndFillValue();
}
}

Если убрать из исполнения первые 4 строки класса, то при переходе в этот метод и попытке кликнуть - открывается левая страница

Запутало еще больше .

у вас и тестовые классы и page наследуються от одного класса .

  1. Класс контроллер для второй страницы юзающий методы из соответвствующего контейнера
    и тут идет Page
    public class AdGroup_Page extends ContainerForAdGroup_Page {

а где тестовый метод то для второй страницы(с анотацией тест который) .

да еще питання вы как запускаете xml ? Если да - то там точно правильно методы прописаны .

Это не совсем тест, по поставленной мне задаче мне нужно более миллиона вариантов рекламных кампаний. По этому это не тест, это тупо перебор всего что есть. Проблема с кликами кнопок, помогите с этим:(
Если есть предложения по упрощению, то с удовольствием применю

А у тебя не возникало такой :

element is not clickable at point other element would receive the click

ошибки?

Возможно старые элементы остаются на странице и просто становятся невидимыми или их с помощью css “задвигают” влево, а так как они все еще присутствуют на странице и/или их запомнило то при следующем клике селениум пытается кликнуть на элемент, которого на странице не видно, а в результате попадает на пункты меню итд…
Такую страничку можно наглядно посмотреть в стандартном инструменте фаерфокса “3D вид”
Как предложение можно искать проблемные элементы через findElements, а потом перебирать результат и возвращать только видимый элемент (через ExpectedConditions)

1 лайк