8

Selenium JavascriptExecutorを実行したときに、nullを返すJavaScriptコードがあります。しかし、Firefox開発者コンソールで実行されたときと同じコードが値を返しました。Selenium Javascriptのエグゼキュータがnullを返す

JavascriptExecutor jsExec = (JavascriptExecutor)driver; 
Object inpType = 
     jsExec.executeScript("function tmp(){...}tmp();"); 
System.out.println("Type: " + inpType); 

以上の出力の代わりに "テキスト" 列のnull

function tmp(){ 
    var attrb = jQuery(jQuery("[name='q']")[0]).attr('type'); 
    if(typeof attrb !== 'undefined' && attrb !== false){ 
     return attrb; 
    } else { 
     return ''; 
    } 
} 

tmp(); 

以下、上記と同じJSと私のwebdriverをコードです。何か案は?

+0

上記のセレンコードを追加しました。ご覧ください。ありがとうございます。 – Jsm

答えて

1

executeScript()で2つのステートメントを実行するという問題があります。 tmp()の関数定義とtmp()の関数呼び出し。

詳細はわかりませんが、関数定義はnullを返すようです。

executeScriptは返される最初の値を返すので、nullを返します。関数を定義せずにコードをインラインで記述すると、それが機能します。

JavascriptExecutor jsExec = (JavascriptExecutor) driver; 
Object inpType = jsExec 
    .executeScript("var attrb = jQuery(jQuery(\"[name='q']\")[0]).attr('type');"+ 
      "if(typeof attrb !== 'undefined' && attrb !== false)" + 
      "{return attrb;}" + 
      "else{return '';}"); 
System.out.println("-------------- Type: " + inpType); 

これは期待値を出力します。

編集:また、あなたの投稿したコードは""の周りに[name='q']をエスケープしません。これで文字列が終了し、構文エラーが発生します。

+0

お返事ありがとうございます。以前はすべてインラインになっていましたが、firefoxは "関数に戻りません"というエラーを返すため、このスニペットを関数tmp()に移動して呼び出しました。引用符に来ると、上記は誤字です。このスクリプトは動的に生成され、ここで私は自分のコードでエスケープしています。簡単にするために、上記のjavascriptを関数呼び出しにコピーしました。 – Jsm

+0

@Jsm 'executeScript()'はreturn文を持つことができます。単に 'executeScript()'のために関数をインラインで使用し、Firefoxに直接入力する関数をラップしますか? –

関連する問題