Перейти к содержимому

Фотография

Selenium+Java: Динамические массивы и таблицы, помогите.


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 12

#1 MichelWBB

MichelWBB

    Новый участник

  • Members
  • Pip
  • 8 сообщений
  • ФИО:Шишкин Михаил
  • Город:Новосибирск


Отправлено 06 декабря 2012 - 12:50

Дело вот в чём. На тестируемой странице существует таблица вида:

0.0 0.1 0.2 0.3 0.4 0.5 0.6
1.0 1.1 1.2 1.3 1.4 1.5 1.6
и тд.
Количество строк может меняться
на каждую ячейку таблицы ссылается css локатор по типу "css=table.grid.2.2"

Хотелось бы, чтобы при открытии страницы, все ячейки начиная с 2.0 и дальше, включались в массив или ArrayList.
Чтобы не приходилось заполнять его вручную для каждой новой появившейся строки.

В java, да и selenium новичок. На данный момент приходится смотреть на то сколько строк в таблице и заполнять ArrayList следующим образом:

ArrayList<String> TableGrid = new ArrayList<String>();
int str=2,stb=0;
for (str=2;str<6;str++) { // Для 6-ти строк
for (stb=0;stb<7;stb++) {
TableGrid.add("css=table.grid."+str+"."+stb);

Подскажите, как лучше реализовать?
  • 0

#2 _Yura

_Yura

    Новый участник

  • Members
  • Pip
  • 50 сообщений
  • ФИО:n/a

Отправлено 06 декабря 2012 - 14:18

попробуйте посчитать строки, к примеру, так:
int numRows = selenium.getXPathCount("//<наш тег>[contains(@css,'table.grid')]").intValue() - 2;

  • 1

#3 MichelWBB

MichelWBB

    Новый участник

  • Members
  • Pip
  • 8 сообщений
  • ФИО:Шишкин Михаил
  • Город:Новосибирск


Отправлено 06 декабря 2012 - 14:56

попробуйте посчитать строки, к примеру, так:

int numRows = selenium.getXPathCount("//<наш тег>[contains(@css,'table.grid')]").intValue() - 2;

Спасибо, попробую. Но не уверен, что это поможет. Мне скорее интересен не сам подсчет строк, а то, чтобы все елементы с локатором css=table.grid.2.0 и более, попали в ArrayList.
  • 0

#4 MichelWBB

MichelWBB

    Новый участник

  • Members
  • Pip
  • 8 сообщений
  • ФИО:Шишкин Михаил
  • Город:Новосибирск


Отправлено 07 декабря 2012 - 07:55

К сожалению, при использовании вашего решения Тест падает по таймауту.
хотел сделать следующим образом: int numRows = selenium.getCssCount("table.grid").intValue() - 2;
Вот что выдает в консоль: java.lang.UnsupportedOperationException: getCssCount
Возможно неверно описываю...
Быть может есть способ прикрутить driver.findElements(By.cssSelector());???
  • 0

#5 panterka

panterka

    Активный участник

  • Members
  • PipPip
  • 102 сообщений
  • ФИО:Panterochka
  • Город:Saint John


Отправлено 07 декабря 2012 - 08:48

Добрый день
У меня тест выполняет подобную задачу, строки считаю таким образом:
List<WebElement> Rows = driver.findElements(By....("..."));
int rows = Rows.size() - 1;
  • 0

#6 MichelWBB

MichelWBB

    Новый участник

  • Members
  • Pip
  • 8 сообщений
  • ФИО:Шишкин Михаил
  • Город:Новосибирск


Отправлено 07 декабря 2012 - 09:23

Добрый день
У меня тест выполняет подобную задачу, строки считаю таким образом:
List<WebElement> Rows = driver.findElements(By....("..."));
int rows = Rows.size() - 1;

Добрый, а можно подробней в части (By....("...")), по какому принципу вы их ищите? По css,name,id?
Каждой моей ячейке соответствует локатор css=table.grid.1.1 и тд.
при использовании List<WebElement> numRows=driver.findElements(By.cssSelector("table.grid"));
в List попадает лишь один элемент "[[[FirefoxDriver: firefox on XP (1c2f7373-f610-4de8-afb4-d6de2d740fdf)] -> css selector: table.grid]]"
Хотелось бы, чтоб попадали все.
  • 0

#7 panterka

panterka

    Активный участник

  • Members
  • PipPip
  • 102 сообщений
  • ФИО:Panterochka
  • Город:Saint John


Отправлено 07 декабря 2012 - 09:39

У меня в данном случае по xpath-у
List<WebElement> Rows = driver.findElements(By.xpath("//*[@id='result']/tbody/tr"));
подсчитываются все строки, далее их текст складываю в массив
  • 0

#8 MichelWBB

MichelWBB

    Новый участник

  • Members
  • Pip
  • 8 сообщений
  • ФИО:Шишкин Михаил
  • Город:Новосибирск


Отправлено 07 декабря 2012 - 09:49

спасибо, с Xpath всё получается замечательно, жаль раньше не попробовал.
Есть ли возможность собрать все ячейки? например:
driver.findElements(By.xpath("//form[@id='result']/div/table/tbody/tr[*]/td[*]"));
Использовать * вместо значений, пока количество не совпадает (
  • 0

#9 panterka

panterka

    Активный участник

  • Members
  • PipPip
  • 102 сообщений
  • ФИО:Panterochka
  • Город:Saint John


Отправлено 07 декабря 2012 - 10:18

Можно сложить в массив данные всех ячеек, пробежав по таблице с помощью xpath-а, если Вам такой вариант подходит
  • 0

#10 MichelWBB

MichelWBB

    Новый участник

  • Members
  • Pip
  • 8 сообщений
  • ФИО:Шишкин Михаил
  • Город:Новосибирск


Отправлено 07 декабря 2012 - 10:27

Можно сложить в массив данные всех ячеек, пробежав по таблице с помощью xpath-а, если Вам такой вариант подходит

А пример кода не покажите?
Так же интересует добавление новых элементов в массив из файла.
Например: если месяц Июль, то считать данные из 1-ой строки, если Август, то из 2-й.
  • 0

#11 panterka

panterka

    Активный участник

  • Members
  • PipPip
  • 102 сообщений
  • ФИО:Panterochka
  • Город:Saint John


Отправлено 07 декабря 2012 - 10:36

List<WebElement> Columns = driver.findElements(By.xpath("//*[@id='result']/table/tbody/tr[..]/td"));
int columns = Columns.size();
List<WebElement> Rows = driver.findElements(By.xpath("//*[@id='result']/tbody/tr"));
int rows = Rows.size();
String[][] report = new String[columns][rows];
for(int i = 0; i < columns; i ++){
int current_col = 0;
for(int j = 0; j < rows; j ++){
report[current_col][j] = driver.findElement(By.xpath("//*[@id='..." + j + "']/td[" + i + "]")).getText();
}
report[current_col][rows] = driver.findElement(By.xpath("//*[@id='...']/td[" + i + "]")).getText();
}
//вывести на консоль записанное
System.out.println("-----------------------------------------------");
for(int i = 0; i < columns; i ++, System.out.println()){
System.out.print(report[i][0] + " |");
for(int j = 0; j < rows; j++){
System.out.print(report[i][j] + " |");
}
}
System.out.println("-----------------------------------------------");

Примерно так...
  • 1

#12 MichelWBB

MichelWBB

    Новый участник

  • Members
  • Pip
  • 8 сообщений
  • ФИО:Шишкин Михаил
  • Город:Новосибирск


Отправлено 07 декабря 2012 - 10:49

List<WebElement> Columns = driver.findElements(By.xpath("//*[@id='result']/table/tbody/tr[..]/td"));
int columns = Columns.size();
List<WebElement> Rows = driver.findElements(By.xpath("//*[@id='result']/tbody/tr"));
int rows = Rows.size();
String[][] report = new String[columns][rows];
for(int i = 0; i < columns; i ++){
int current_col = 0;
for(int j = 0; j < rows; j ++){
report[current_col][j] = driver.findElement(By.xpath("//*[@id='..." + j + "']/td[" + i + "]")).getText();
}
report[current_col][rows] = driver.findElement(By.xpath("//*[@id='...']/td[" + i + "]")).getText();
}
//вывести на консоль записанное
System.out.println("-----------------------------------------------");
for(int i = 0; i < columns; i ++, System.out.println()){
System.out.print(report[i][0] + " |");
for(int j = 0; j < rows; j++){
System.out.print(report[i][j] + " |");
}
}
System.out.println("-----------------------------------------------");

Примерно так...


Спасибо. Быть может присоветуете, что-то по поводу загрузки из файла?
  • 0

#13 MichelWBB

MichelWBB

    Новый участник

  • Members
  • Pip
  • 8 сообщений
  • ФИО:Шишкин Михаил
  • Город:Новосибирск


Отправлено 07 декабря 2012 - 11:24

Появилась новая проблема, пробежав по таблице таким образом:
List<WebElement> Rows=driver.findElements(By.xpath("//form[@id='Table']/div/table/tbody/tr[..]/td[..]"));
выяснилось, что в список попали не все элементы. Как оказалось на часть ячеек ссылаются только css локаторы.
Есть ли способ всё же выбрать все ячейки с их помощью? Что то типа аналогичного:
List<WebElement> RowsCss=driver.findElements(By.cssSelector("table.grid.[..].[..]"));
  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных