从javascript onclick返回值到变量或使用onclick更改全局变量

时间:2015-12-14 15:44:45

标签: javascript python html selenium

我尝试获取网站上clicked元素(任何元素)的文本值,将其从javascript返回到Selenium(Python)并使用该信息将每个单击的元素放入我的日志中。甚至可以使用selenium和javascript来实现吗?

此函数可以显示元素,但不会返回任何内容(正常的onclick行为)。我知道我可以使用selenium从警报弹出窗口中读取文本,但是每次点击鼠标都会使我的浏览器闪烁。

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不是正确的答案。

我可以通过在click事件上向localstorage写一些内容然后在python中检查localstorage中的值来检测某个元素被点击的时间。但它并不普遍。我需要找到并设置我想要观察的每个元素。

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;
   } 
}

之后你从p​​ython selenium调用javascript

z=driver.execute_script(javascript1)
if z=="comments link was clicked":
        #do something with this information

有没有办法获取用户在浏览器中点击的对象的信息?我正在使用Selenium和Firefox。

编辑: 您可以使用getEL()并在localstorage中写入每个onclick输出来获取每个单击的元素。

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。

Reading localStorage content in Selenium (Python2)

您能想到将点击的对象发送到python的其他任何方式吗?

2 个答案:

答案 0 :(得分:4)

如果我理解正确,您只是在点击页面上的任何元素时尝试获得通知,以便您可以对该信息执行某些操作?

您需要一个全局事件处理程序。

在纯粹的vanilla 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
}

如果您想“使用此信息执行某些操作”,您可以使用多种选项,因为您似乎已经解决了问题。您可以在此处执行的最佳事件是向您控制的HTTP服务器发送AJAX请求,然后接收服务器端脚本可以将详细信息记录到文件(或者您使用它执行的任何操作)。 / p>

您的代码表示单击某些内容时,您希望将其保存到localStorage - 我建议您保存字符串化的base64编码的JSON,其中包含每个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);
}

答案 1 :(得分:1)

最后,我可能会使用 window.name 全局变量。与LocalStorage不同,它在页面更改之间存储有关已点击URL的信息。 LocalStorage无法保存有关页面更改的任何数据。

https://stackoverflow.com/a/1981681/5678519