2015-12-14 14 views
10

JavaScriptを使用してJavaScriptからSelenium(Python)に戻し、その情報を使用して私のログのすべてのクリックされた要素。それはセレンとjavascriptを使用して達成することさえ可能ですか?JavaScriptからonclickを変数に返すか、グローバル変数をonclickで返す

この関数は要素を表示できますが、何も返しません(通常のonclick動作)。私はセレンを使って警告ポップアップからテキストを読むことができることを知っていますが、それはマウスクリックごとにブラウザを点滅させます。今セレンで動作するようには思えないのjavascriptはconsole.logにアクセスしようとし

function getEl() 
{ 
    var ev = arguments[0] || window.event, 
    origEl = ev.target || ev.srcElement; 
    alert(origEL.text) 
} 

document.onclick = getEl; 

そうに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のセレン

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

からJavaScriptを呼び出すブラウザでユーザーがクリックしたオブジェクトの情報を取得する方法はありますか?私はFirefoxでSeleniumを使用しています。

EDIT: getEL()を使用してすべてのクリックされた要素を取得し、すべてのonclick出力をlocalstorageに書き込むことができます。

localStorage.setItem(origEl.text, origEl.text); 

ローカルストレージを作成し、

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にクリックされたオブジェクトを送信するために他の方法を考えることができますか?

+0

なぜセレンに送信しますか?なぜあなたはその情報をいくつかのpython httpサーバに送信しないのですか? –

+0

私はそのSelenium Scriptをローカルで動作する私の試験アプリケーションの一部として使用したいので。私の現在のスクリプトはfirefoxプロフィールを起動し、あなたが正しいリンクをクリックしたかどうかを確認します。あなたがそれをすると、それはあなたにポイントを与えます。 Seleniumはユーザーの入力を監視するように設計されていないことがわかっていますが、これは実行できると思います。監視されているjavascriptは、訪問されたすべてのウェブページから始まります。ユーザーがウェブページをクリックした正確な内容を監視するためのオープンソースツールは知られていません。私の場合、POSTSとGETSでは不十分です。 –

+0

これは実際の動作のようです。 [link](http://s7.postimg.org/yox2swzy2/click.jpg) –

答えて

4

私がこれを正しく理解していれば、その情報で何かできるように、ページのどの要素がクリックされたときに通知を受けようとしているだけですか?

あなたは、グローバルイベントハンドラをしたいです。純粋なバニラ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); 
} 
1

最後に、私はおそらくwindow.nameグローバル変数を使用します。 LocalStorageと異なり、ページの変更の間にクリックされたURLに関する情報を格納します。 LocalStorageはページの変更に関するデータを保存できません。

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

関連する問題