2015-05-22 2 views
2

Я пытаюсь извлечь данные из таблицы в List<List<String>> в java. Ниже приведен код. Но для получения данных требуется 20 секунд. Хотелось бы узнать, есть ли какой-либо другой способ получения данных из таблицы? faster?Лучший способ получить данные столбцов из веб-таблицы с помощью webdriver

List<WebElement> rows = table.findElements(By.xpath(".//tbody//tr//td//..")); 
List<ArrayList<String>> rowsData = new ArrayList<ArrayList<String>>(); 

for(WebElement row:rows){ 
    List<WebElement> rowElements = row.findElements(By.xpath(".//td")); 

    ArrayList<String> rowData = new ArrayList<String>(); 

    for(WebElement column:rowElements){ 
     rowData.add(column.getText().toString()); 
    } 

    rowsData.add(rowData); 
} 

return rowsData; 
+0

Если вам не нужно брать все столбцы, я бы предложил, не делайте этого.Попробуйте просто найти один элемент, если это так. – Saifur

+0

Мне нужно получить все данные столбцов, так как эти данные нужно сравнивать с данными из db/criteria. – user3188928

+0

Вам нужны столбцы и строки? – Saifur

ответ

0

Прежде всего, ваш вопрос немного удивителен, как он работает? У вас есть . в xpaths, и по моим знаниям selenium действительно нужен . в xpath. В любом случае ответ на ваш вопрос:

  1. Если есть возможность использовать любой другой элемент локатора, чем XPath затем использовать это, это, безусловно, сократить время выполнения. Поскольку вы использовали для цикла, и каждый цикл попытается найти элемент, используя xpath и selenium, проанализирует весь html-документ, чтобы найти элемент, поэтому, очевидно, это увеличит время выполнения.

  2. Если нет возможности использовать какой-либо другой локатор, кроме xpath, тогда вы можете отключить неявное ожидание перед выполнением операции выше. Поскольку ваш код не выполняет никаких действий, таких как щелчок, который обновляет загруженную страницу, поэтому не будет проблем, связанных с временем. Просто убедитесь, что перед выполнением вышеуказанной операции требуется table dom полностью загружен.

Не забудьте включить неявное ожидание после завершения выше.

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

driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); 
List<WebElement> rows = table.findElements(By.xpath("//tbody//tr//td//..")); 
List<ArrayList<String>> rowsData = new ArrayList<ArrayList<String>>(); 

for(WebElement row:rows){ 
List<WebElement> rowElements = row.findElements(By.xpath("//td")); 

ArrayList<String> rowData = new ArrayList<String>(); 

for(WebElement column:rowElements){ 
    rowData.add(column.getText().toString()); 
} 

rowsData.add(rowData);} 
return rowsData; 

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
1

Я думаю JSoup это лучший вариант для увеличения HTML разбора. Он предоставляет довольно похожий API до Selenium.

String html = driver.findElement(By.tagName("table")).getAttribute("innerHTML"); 
ArrayList<String> colsArray = new ArrayList<>(); 
HashMap<Element, ArrayList<String>> dict = new HashMap<>(); 

Document document = Jsoup.connect(html).get(); 
Elements table = document.select("table"); 

Elements rows = table.select("tr"); 

for (Element row: rows){ 

    Elements list = row.select("td"); 
    ArrayList<String> newList = new ArrayList<>(); 

    for (Element str: list){ 
     newList.add(str.text()); 
    } 

    dict.put(row ,newList); 
} 

return dict; 
+0

см. Http://stackoverflow.com/questions/40952377/loop-runtime-issue –

0

Посмотрите, проблема вызвана медлительностью селена. Если вы будете использовать некоторую lib для захвата html - тот же алгоритм будет работать в 1000 раз быстрее.

Основная идея:

  1. делать всю работу в селена за исключением синтаксического анализа таблицы.

  2. Когда вам нужно разобрать таблицу, взять InnerHtml из этой таблицы с помощью Selenium

  3. Разбор этот HTML с помощью внешнего Lib

В случае C# вы можете использовать HTMLAgilityPack. В случае java - вам нужно это сделать. У меня было более чем в 1000 раз быстрее результат с тем же алгоритмом разбора таким образом.

Смежные вопросы