Проблема с получением сгруппированного списка элементов


(katti) #1

Добрый день!
У меня есть такая таблица такого вида:

<table>
<tr>
    <td>1</td>
    <td>2</td>
</tr>
<tr>
    <td>3</td>
    <td>4</td>
</tr>
</table>

Я понимаю как, например, получить все элементы tr или по-отдельности каждый td, но вот можно ли как-то делать выборку, чтобы получить массив в виде:
array(
    0 => array (1,2) ,
    1 => array (3,4)
)
Ну или какой-то похожей структуры? вобщем, чтобы как-то можно было объединять эти td по группам, где они являются дочерними одного и того же tr


(Taras) #2

2-х мерный массив создать нужно и в цикле заполнять элементы по какотому принципу.

Нужно написать универсальные геттеры ваших элементов сначала, тоесть доставать отдельно строки 


(Taras) #3

 

WebElement table = 
driver.findElement(By.id("table_id")); 

List<WebElement> rows = table.findElements(By.tagName("tr")); 
Iterator<WebElement> i = rows.iterator(); 
System.out.println("-----------------------------------------------"); 
while(i.hasNext()) { 
        WebElement row = i.next(); 
        List<WebElement> columns = row.findElements(By.tagName("td")); 
        Iterator<WebElement> j = columns.iterator(); 
        System.out.print(" | "); 
        while(j.hasNext()) { 
                WebElement column = j.next(); 
                System.out.print(column.getText()); 
                System.out.print(" | "); 
        } 
        System.out.println("")
         
System.out.println("-----------------------------------------------"); 


(katti) #4

спасибо Вам большое за старания!
но у меня какая-то видимо не очень удачная версия WebDriver-PHP (https://github.com/chibimagic/WebDriver-PHP), потому что метод-аналог для next в phpunit работает некорректно... =(
Когда на странице много td, то метод возвращает не дочерний элемент, а первый, который есть на странице...
Буду искать еще варианты...
 


(Taras) #5

ну это Java


(katti) #6

наверное, придется со временем переквалифицироваться мне)


(Taras) #7

накалякал тут для Вас оберточку для таблиц такого вашего типа универсальную

може пригодиться

не компилил и не пробовал запускать, так что можетет попробувать))

 

package Core;
 
 
import java.util.ArrayList;
import java.util.List;
 
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
 
public class Table {
 
private WebDriver driver = PageLoader.GetInstance();
 
String id;
List<WebElement> raws;
List<WebElement> columns;
 
Table(String id){
this.id = id;
}
 
private WebElement getTable() {
WebElement table = driver.findElement(By.id(id));
return table;
}
 
private List<WebElement> tableToArray() {
List<WebElement> tableElements = getTable().findElements(By.xpath("//tr/td"));
return tableElements;
}
 
public int getRawsSize(){
List<WebElement> rows = getTable().findElements(By.xpath("//tr")); 
return rows.size();
}
 
public int getColumnsSize(){ 
return (tableToArray().size()/getRawsSize());
}
 
public String[][] getValueTable (){
String valueTable[][] = new String [getRawsSize()][getColumnsSize()];
 
for (int i=0;i<getRawsSize();i++){
for(int j=0;j<getColumnsSize();j++){
int k = i*getColumnsSize();
valueTable[i][j] = tableToArray().get(j+k).toString();
}
}
 
return valueTable;
 
public String[] getTableRaw (int i) {
String raw[] = new String [getColumnsSize()];
for(int j = 0; j < getColumnsSize(); j++)
{
raw[j] = getValueTable()[i][j];
}
 
return raw;
}
 
public String[] getTablecolumn (int j) {
String column[] = new String [getRawsSize()];
for(int i = 0; i < getRawsSize(); i++)
{
column[i] = getValueTable()[i][j];
}
 
return column;
}
 
 
}
 

(Mykhailo Poliarush) #8

покажите как вы реализовали ваш код?

есть два метода выбора в вашем фреймворке get_next_element и  get_all_next_elements

вам нужно использовать метод get_all_next_elements, который вернет вам все запиши, а не только первую

 

код методов такой, как видите во втором делается цикл и возвращает много элементов



  // See http://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/element/:id/element
  public function get_next_element($locator) {
    $payload = WebDriver::ParseLocator($locator);
    $response = $this->execute("POST", "/element", $payload);
    $next_element_id = WebDriver::GetJSONValue($response, "ELEMENT");
    return new WebDriver_WebElement($this->driver, $next_element_id, $locator);
  }
  
  // See http://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/element/:id/elements
  public function get_all_next_elements($locator) {
    $payload = WebDriver::ParseLocator($locator);
    $response = $this->execute("POST", "/elements", $payload);
    $all_element_ids = WebDriver::GetJSONValue($response, "ELEMENT");
    $all_elements = array();
    foreach ($all_element_ids as $element_id) {
      $all_elements[] = new WebDriver_WebElement($this->driver, $element_id, $locator);
    }
    return $all_elements;
  }

(katti) #9

спасибо большущее! уверена, что пригодится)