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

Posted

技术标签:

【中文标题】从 javascript onclick 返回值到变量或使用 onclick 更改全局变量【英文标题】:Return value from javascript onclick to variable or change global variable with onclick 【发布时间】:2016-03-20 04:09:32 【问题描述】:

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

此函数可以显示元素,但不会返回任何内容(正常的点击行为)。我知道我可以使用 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 不是正确的答案。

我可以通过在单击事件上向 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;
    

之后你从 python selenium 调用 javascript

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

有什么方法可以获取用户在浏览器中点击的对象的信息?我在 Firefox 中使用 Selenium。

编辑: 您可以通过使用 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。

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

【问题讨论】:

为什么要将它发送到 selenium?为什么你不只是将这些信息发送到一些 python http 服务器? 因为我想使用 Selenium 脚本作为我在本地运行的考试应用程序的一部分。我当前的脚本启动 Firefox 配置文件,然后检查您是否单击了正确的链接。当你这样做时,它会给你一个点。我知道 Selenium 并非旨在监视用户输入,但我认为这是可以做到的。监控 javascript 在每个访问的网页上开始。我不知道有任何开源工具可以监控用户点击网页的具体内容。在我的情况下,POSTS 和GETS 是不够的。 这就是它在行动中的样子。 link 我怀疑硒可以这样使用。 Javascript 没有直接与 selenium 驱动程序通信的 api。我能想到的唯一方法是通过 ajax 或 websockets 与您自己的应用程序服务器进行通信。 好的。我会考虑一下。现在我可以将值从 javascript 返回到 python,但我必须手动设置检查网站上的每个元素,并且只能是间接的(如您在链接图像和第二个代码片段中所见)。寻找从 onclick 事件返回值的另一种方式给我带来了任何结果。它有点工作,但设置一切很痛苦。感谢您的意见。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

如果我理解正确,您只是想在页面上的任何元素被点击时得到通知,以便您可以对这些信息进行操作?

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

在纯原生 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 请求,然后接收服务器端脚本可以将详细信息记录到文件中(或您对它执行的任何操作)。

您的代码表明,当单击某些内容时,您希望将其保存到 localStorage - 我建议您保存字符串化的 base64 编码 JSON,其中包含每个单击事件的目标元素。以下是您可以使用的一些代码:

/**
 * 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);

【讨论】:

以上是关于从 javascript onclick 返回值到变量或使用 onclick 更改全局变量的主要内容,如果未能解决你的问题,请参考以下文章

js中onclick传值问题

从onclick到function到ajax的url问号传多个参数(更多的话以此类推)问题

从选择返回值到函数

如何从 javascript 文件中获取函数的值到 ASP.NET MVC 视图?

从arraylist返回值到ajax成功函数

Python - 从函数返回多个值到不同的数组