2017-03-25 6 views
0

私はセレンwebdriverをを使用してウェブサイトをスクラップしようとしています。 私は自分自身を教える言語としてjavascriptとnodejsを選択しました。 以下は、ツールの動作を理解するための非常に基本的なコードです。セレンウェブドライバはどのようにjavascriptで動作しますか?

私は、次のコマンドラインでそれを起動します。 ノード--debug-BRK = 5858のsrc/app.js

var chromedriver = require('chromedriver'); 

var webdriver = require('selenium-webdriver'), 
     By = webdriver.By, 
     until = webdriver.until; 

    var driver = new webdriver.Builder() 
     .forBrowser('chrome') 
     .build(); 

    driver.get('http://www.google.com/ncr'); 
    debugger; 
    driver.findElement(By.name('q')).sendKeys('webdriver'); 
    driver.findElement(By.name('btnG')).click(); 
    driver.wait(until.titleIs('webdriver - Google Search'), 1000); 
    driver.quit(); 

私はIDEとしてvscodeを使用しています。 F5キーを押すと、コードにブレークポイントを設定した後、ブレークポイントがヒットしますが、ブラウザはまだ開かれていません。私は(VScode中)、スクリプトが終了、再開をクリックすると、ブラウザが起動され、対応するコマンドが実行されているそれはすでにヒットしたので、だけで、その後、私のブレークポイントは現在、無視されています。

これは、以下の結果を持っている:私はステップによってセレンwebdriverをステップため、XPathのコマンドを使用して、検索要素の内容を評価することができませんすることはできません。

私は何を参照しないが、何かが欠けています。 スリープステートメントを追加する必要がありますか?

私が見たほとんどの人は、Javaを使用していますが、可能であれば私はむしろジャバスクリプトに固執すると思います。

答えて

0

私はあなたのプログラムで見ることができるの問題がいくつかあります。

  1. webdriverををプログラムするためにJavaScriptを使用している場合、重要な概念は、すべての関数呼び出しは非同期であり、ThenableまたはPromiseを返すということです。したがって、シーケンシャルプログラミングのように行単位で書くことはできません。

    あなたはこのように動作する必要があります。ここに

    driver.findElement(By.name('q')).sendKeys('webdriver') 
        .then(function(){ 
         driver.findElement(By.name('btnG')).click(); 
         ... 
        }); 
    

    参照webdriverをのJavaScript APIドキュメント:デバッグの観点から https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/index.html

  2. を、あなたはブラウザの開発者向けツールで一時停止し、そこトレースあれば、どのようなトレースするのはあなたが掻き取ろうとしているウェブサイトのプログラムですが、ウェブドライバのプログラムはトレースしていません。 WebStormを使って私のwebdriverプログラムをトレースします。

+0

私が知っているセレンは約束で動作しますが、ここで説明したよう:https://github.com/SeleniumHQ/selenium/wiki/WebDriverJs、あなたはもう「.then」を必要としません。私は今のところvsocdeを使用しており、webdriverプログラムをデバッグすることはできません。現在、ノード--debug-brkを実行していますが、これではデバッグできません。 – Charly

関連する問題