从 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 更改全局变量的主要内容,如果未能解决你的问题,请参考以下文章
从onclick到function到ajax的url问号传多个参数(更多的话以此类推)问题