【问题标题】:Return value from javascript onclick to variable or change global variable with onclick从 javascript onclick 返回值到变量或使用 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 事件返回值的另一种方式给我带来了任何结果。它有点工作,但设置一切很痛苦。感谢您的意见。

标签: javascript python html selenium


【解决方案1】:

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

https://stackoverflow.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);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 2023-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多