Возвращаемое значение из 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/...