Возвращаемое значение из javascript onclick в переменную или изменение глобальной переменной с помощью onclick
Я пытаюсь получить текстовое значение щелкнутого элемента (любого элемента) на веб-сайте, вернуть его из javascript в Selenium (Python) и использовать эту информацию для размещения каждого щелкнутого элемента в моем журнале. Можно ли даже добиться достижения селена и javascript?
Эта функция может отображать элемент, но ничего не возвращает (обычное поведение onclick). Я знаю, что я могу читать текст из всплывающих окон, используя селен, но это сделает мой браузер мгновенным при каждом щелчке мыши.
function getEl()
{
var ev = arguments[0] || window.event,
origEl = ev.target || ev.srcElement;
alert(origEL.text)
}
document.onclick = getEl;
Попытка доступа к javascript console.log сейчас не работает в Selenium, поэтому использование console.log не является правильным ответом.
Я могу обнаружить, когда был щелкнут определенный элемент, написав что-то в localstorage при событии клика, а затем проверив значение в localstorage в python. Но это не универсально. Мне нужно найти и настроить каждый элемент, который я хочу наблюдать.
function find_element()
{
aTags = document.getElementsByTagName("a");
searchText = "comments";
for (var i = 0; i < aTags.length; i++)
{
if (aTags[i].textContent == searchText)
{
found = aTags[i];
return found;
}
}
}
found=find_element();
function saveEvent()
{
localStorage.setItem("ZAD1.1", "1");
}
if(found)
{
found.addEventListener("click",saveEvent,false);
var x=localStorage.getItem("ZAD1.1");
if (x=="1")
{
count="comments link was clicked";
return count;
}
}
После этого вы вызываете javascript из python selenium
z=driver.execute_script(javascript1)
if z=="comments link was clicked":
#do something with this information
Есть ли способ получить информацию об объектах, щелкнутых пользователем в браузере? Я использую Selenium с Firefox.
EDIT:
Вы можете получить каждый элемент с щелчком, используя getEL() и записывая каждый вывод onclick в localstorage.
localStorage.setItem(origEl.text, origEl.text);
Создайте локальное хранилище, а затем напишите temp как массив или строку
var temp="VISITED LINKS : "
for (var i = 0; i < localStorage.length; i++){
temp +=localStorage.getItem(localStorage.key(i))+" ";}
return temp
Затем вы можете вернуть весь список на python.
![Чтение содержимого локальной хранилища в Selenium (Python2)]()
Можете ли вы придумать какой-либо другой способ отправки кликов объектов на python?
Ответы
Ответ 1
Если я правильно понимаю это, вы просто пытаетесь получить уведомление, когда на него нажимается какой-либо элемент на странице, чтобы вы могли что-то сделать с этой информацией?
Вам нужен глобальный обработчик событий.
В чистом ванильном JavaScript это выглядит следующим образом:
document.body.onclick = function(e) {
console.log(e); // `e` is the click event
console.log(e.target); // `e.target` is the element that was clicked
// do something with this information
}
Если вы хотите "сделать что-то с этой информацией", у вас есть несколько вариантов, как вы, кажется, уже разработали. Лучшее, что вы можете сделать здесь, - отправить запрос AJAX на HTTP-сервер, которым вы управляете, после чего принимающая сторона сервера script может записывать данные в файл (или все, что вы с ним делаете).
Ваш код указывает, что когда что-то щелкнули, вы хотите сохранить его в localStorage - я бы рекомендовал вам сохранить стробированный JSON с кодировкой base64, содержащий целевой элемент каждого события click. Вот какой код вы можете использовать для этого:
/**
* Constant. This is the (string) key name of the
* save location in localStorage.
*/
var locationName = "myNamespace_clicks";
/**
* Given an object, will JSON- and base64-encode
* that object so it can be stored in localStorage.
*/
function encodeForStorage(dataObject) {
return btoa(JSON.stringify(dataObject));
}
/**
* Given a string from localStorage, will decode that
* string from JSON and base64 to a JS object.
*/
function decodeStoredObject(dataString) {
return JSON.parse(atob(dataString));
}
/**
* Given an item, will add this item to the data stored
* in localStorage, and then save the new data.
*/
function addItemToStorage(item) {
var rawStoredData = localStorage.getItem(locationName);
var dataObject;
if(rawStoredData) {
dataObject = decodeStoredObject(rawStoredData);
}
else {
dataObject = {
"clicks": []
}
}
dataObject["clicks"].push(item);
localStorage.setItem(locationName, encodeForStorage(dataObject));
}
document.body.onclick = function(e) {
addItemToStorage(e.target);
}
Ответ 2
В конце я, вероятно, буду использовать глобальную переменную window.name. В отличие от LocalStorage, он сохраняет информацию о кликах по URL-адресам. LocalStorage не может сохранять данные на смене страницы.
fooobar.com/info/60684/...