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

Как создать массив из локаторов и кликать по элементу из него же?


(roman_ua) #1

Вопрос такой как создать массив из элементов и в цикле вызывать клик на элемент из этого массива?
Пробовал вот так.

String myarray = selenium.getEval("new Array(\"css=#g571 > text\", \"css=#g570 > text\,......");
		for (int i = 0; i < 6; i++) {
			selenium.click(parseInt(Math.random()*myarray.length()));
		}

Клик не происходит.


(roman_ua) #2

Selenium RC Java


(Dmytro Makhno) #3

Простите не понял, с чем связана эвалуация массива через джава скрипт, как на счет

public class HelloRc{

     public static void main(String []args){
        String[] myarray = {"css=#g571 > text", "css=#g572 > text", "css=#g573 > text"};
        //iterate
        for(String s : myarray) {
            System.out.println("Locator is "+s);
            //selenium.click(s)            
        }
        //random locator
        for (int i = 0; i < 6; i++) {
            
            int random_index = (int)Math.floor(Math.random()*myarray.length);
            System.out.println("Index is "+random_index+"  Locator is "+myarray[random_index]);
            //selenium.click(myarray[random_index])
        }
     }
}

проверял я тут

http://www.compileonline.com/compile_java_online.php

rc вызовы закоменчены, уж и не помню как он работает. :slight_smile:


(roman_ua) #5

Да, то что я написал не совсем подходит. Проще конечно объяснить саму ситуацию для тестирования. К примеру у меня есть 100 кнопок каждая со своим id, но не все из этих кнопок доступны для клика. Мне нужно выполнить клик на кнопку после чего у меня изменится значение count. К примеру мне нужно пройтись по такому списку и кликнуть на 6 кнопок чтобы count был 6, а потом продолжить тест дальше. Как то так.


(Dmytro Makhno) #6

Делайте, в чем сложность то?
Я сам Ваш пример не понял (перечитал несколько раз), но если у вас алгоритм есть переносите в код. :smile:

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


(roman_ua) #7

Сделал по вашему примеру все равно клик не вызывается.


(Кирилл Р) #8

Попробуй в цикле вместо selenium.click просто выводить результат в консоль, например, а потом найти эти элементы на странице. Может, их вообще там нет.


(roman_ua) #9

Они есть в этом я уверен.


(Кирилл Р) #10

Была похожая проблема, когда тест выполнялся в эксплорере, а xpath элементов я смотрел в фаерфоксе. В итоге выяснилось, что в эксплорере html выглядит по-другому и тех элементов, которые я искал, там просто нет.


(roman_ua) #11

тут такой проблемы нет. Элементы есть на странице но почему то клика нет.


(roman_ua) #12

Locator is css=#g571 > text
java.lang.NullPointerException

вот такая ошибка


(roman_ua) #13

Разобрался. Теперь мне нужно добавить проверку которая после клика определит произошел клик или нет.


(roman_ua) #14

Теперь код выглядит где то так:

public class HelloRc{

 public static void main(String []args){
    String[] locators= {"css=#g571 > text", "css=#g572 > text", "css=#g573 > text"};
     for (int i = 0; i < locators.length; i++) {
		clickOnPlace(locators[i]);
		String ticketCount = saveTicketCountWhileLoop(app);
		System.out.println(ticketCount);
		if (ticketCount.equals("1")) {
	    break;
		}
		app.getNavigationHelper().clickOnSaleButton();
Почему когда не добавляешь строчку app.getNavigationHelper().clickOnSaleButton(); , то оно после проверки условия if повторяет цикл а когда ее добавил то оно на первой итерации выходит ?

(roman_ua) #15

Разобрался. Не было проверки на условие ticketCount.equals(“0”)

public static void main(String []args){
String[] locators= {“css=#g571 > text”, “css=#g572 > text”, “css=#g573 > text”};
for (int i = 0; i < locators.length; i++) {
try {
clickOnPlace(locators[i]);
} catch (Exception SeleniumException){}
String ticketCount = saveTicketCountWhileLoop(app);
System.out.println(ticketCount);
if (ticketCount.equals(“1”)) {
break;
} else if (ticketCount.equals(“0”)) {
continue;
}
}
clickOnSaleButton();


(roman_ua) #16

Теперь почему-то ticketCount при Exception не всегда равен “1” и получается выход с цикла нет. Надо поменять на условие if (Integer.parseInt(ticketCount) >= 1 ) {
break;


(roman_ua) #17

Сегодня еще чуток отрефакторил код =) потому как при каждом тесте брались постоянно использованные уже ранее элементы, то я решил брать случайный элемент из массива.
public static void main(String []args){
String[] locators= {“css=#g571 > text”, “css=#g572 > text”, “css=#g573 > text”};
int randomLocators = (int)(Math.random()*locators.length);

	for (int i = 0; i < locators.length; i++) {
		try {
			clickOnLocator(locators[randomLocators]);

		} catch (Exception SeleniumException) {
		}
		
		String Count = saveCountWhileLoop();
		System.out.println(Count);
		if (Integer.parseInt(Count) >= 1) {
			break;
		} else if (Count.equals("0")) {
			continue;
		}