это мой первый пост здесь, так что будьте осторожны. :)
Мой сценарий должен открыть страницу форума, заполнить поля входа/выхода, отправить форму и сохранить определенные данные с недавно открытой страницы (список пользователей, электронные письма и т.д.). Как только я отправлю форму, мне нужно подождать около 5 -10s, поэтому мой тайм-аут довольно большой. Я очень благодарен Виджаю, потому что я начал с ответа на этот пост: Как отправить форму с помощью PhantomJS
Только для целей тестирования содержимое веб-сайта console.log два раза: один раз перед входом в систему и один раз после. Он также работает.
Содержимое HTML списка пользователей состоит из множества элементов. Один из них выглядит (обрезает все стили, классы и т.д.):
<tr>
<td class="gen" align="center">
<a href="mailto:[email protected]">[code for img]</a>
</td>
<td class="gen" align="center">
<a href="www.website.com">[code for img]</a>
</td>
//many tds
</tr>
TD и TR не имеют идентификатора или имени. Есть несколько столбцов, но я хочу сохранить только csv (если это невозможно из-за отсутствия идентификаторов полей, я могу сохранить все в csv, но это менее желательное решение). Я хотел бы как-то идентифицировать нужные данные, ища "mailto", а затем сохранить только "[email protected]" в файл.
Я не знаю, как не только сохранить его в csv, но и позволить скрипту узнать, какие данные должны получить в ячейку в электронной таблице.
Код:
var page = require('webpage').create();
var fs = require('fs');
var testindex = 0, loadInProgress = false;
page.onConsoleMessage = function(msg) {
console.log(msg);
};
page.onLoadStarted = function() {
loadInProgress = true;
console.log("load started");
};
page.onLoadFinished = function() {
loadInProgress = false;
console.log("load finished");
};
var steps = [
function() {
//Load Login Page
page.open("http://www.website.com/memberlist.php");
},
function() {
//Enter Credentials
page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {
page.evaluate(function() {
$("input[name='username']").val("login");
$("input[name='password']").val("password");
$("input[value='Log in']").click();
console.log("form filled in"); //works
});
var markup = page.content;
console.log(markup);
page.render("form filled.png"); //works
});
},
function() {
// Output content of page to stdout after form has been submitted
page.evaluate(function() {
var record = document.querySelectorAll("tr.row1"); //input.row1, input.row2
//console.log(inputs.length);
for (i=0; i < record.length; i++){
console.log(document.querySelectorAll('tr.row1')[i].outerHTML);
}
});
}
];
interval = setInterval(function() {
if (!loadInProgress && typeof steps[testindex] == "function") {
console.log("step " + (testindex + 1));
steps[testindex]();
testindex++;
}
if (typeof steps[testindex] != "function") {
console.log("test complete!");
page.render('export.png'); //works. it a screenshoot in a newly opened webpage already after succesful log in.
phantom.exit();
}
}, 10000);
Вы можете создать строку, представляющую содержимое файла csv, а затем использовать URI данных (для этого вопроса SO), чтобы он мог быть загружен.
Чтобы получить представление csv таблицы:
function tableToCSV(tabID) {
var csvLines = [];
var tabEl = document.getElementById('tabID');
var rows = tabEl.getElementsByTagName('tr');
for(var row = 0; row < rows.length; ++row) {
var cells = rows[row].getElementsByTagName('td');
var rowValues = [];
for(var cell = 0; cell < cells.length; ++cell) {
var cellText = cells[cell].innerText;
// could escape commas here
rowValues.push(cellText);
}
csvLines.push(rowValues.join(','));
}
return csvLines.join("\n");
}