2017-12-13 29 views
0

これらのコード行が2つあります。私はSeleniumを使用しています。NullReferenceが返されますが、nullではありません

IJavaScriptExecutor js = driver as IJavaScriptExecutor; 
string getInfo1 = (string)js.ExecuteScript("return angular.element(document.getElementById('bank-list')).scope().info1").ToString(); 
string getInfo2 = (string)js.ExecuteScript("return angular.element(document.getElementById('bank-list')).scope().info2").ToString(); 
string getInfo3 = (string)js.ExecuteScript("return angular.element(document.getElementById('bank-list')).scope().info3").ToString(); 

コードの1行目では、例えば、Jamesのために成功し、リターン実行されますが、コードのいくつかの理由で第二ラインのためnull私を返しますが、私は、サイト上のコードを自分で試してみるならば、それは私に情報を返します完全に。

私の質問は次のとおりです。原因が考えられますが、自分で確認しても応答が得られません。

+0

あなたが実行したとき、それは準備ができていますが、よりスクリプトが速く情報を引っ張っている、おそらくタイミングの問題手動でページが完全にロードされます。 – JeffC

答えて

0

Javascriptは、Seleniumを使用して実行するのに数ミリ秒かかります。あなたはリターンがnullとは異なる場合が待っている、それを処理することができます

IJavaScriptExecutor js = Driver as IJavaScriptExecutor; 
var result = null as string; 
new WebDriverWait(Driver, new TimeSpan(0, 0, 5)).Until(x => 
    (result = (string)js.ExecuteScript("your script")) != null); 

または、醜い方法で:

IJavaScriptExecutor js = Driver as IJavaScriptExecutor; 
var result = null as string; 
for (var i = 0; i <= 10000; i += 100) 
{ 
    result = js.ExecuteScript("your script").ToString(); 
    if (!string.IsNullOrEmpty(result)) break; 

    Thread.Sleep(100); 
    if (i >= 5000) throw new Exception("timed out."); 
} 
関連する問題