2016-09-05 5 views
1

私はSeleniumの新機能で、ウェブサイトのページから画像を取得するための小さなプロジェクトを実行しようとしています。C#でSeleniumとウェブサイトのすべてのリンクを反復する方法

これは、foreachの2番目のloofでStaleElementReferenceExceptionをスローします。 if文に例外がスローされます。 GoToUrl()の後でGetAttribute()を使用することはできませんが、どのようにすべてのWebページを繰り返し処理するのですか?

driver.Navigate().GoToUrl("http://www.xxxxxxxx.com/"); // dummy web address 
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10)); 
IList<IWebElement> results = driver.FindElements(By.CssSelector(".list-menu > li > ul > li > a")); 

foreach (IWebElement result in results) 
{ 
    if (result.GetAttribute("href").Length>0) // It throws EXCEPTION here ******* 
    { 
     driver.Navigate().GoToUrl(result.GetAttribute("href")); 
     driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(20)); 

     //serie-list-product-four-column 
     IList<IWebElement> gridResults = driver.FindElements(By.CssSelector(".serie-list-product-four-column > li > a")); 
     foreach (IWebElement gridResult in gridResults) 
     { 

     } 
    } 
} 

答えて

2

次のリンクに移動するには、そのリンク先のページに戻る必要があります。移動しようとしているリンクがセレンドライバのページにないため、古いリンクの例外がスローされます。必要に応じて 'driver.Navigate()。Back()'を追加するだけです。

これは、再帰関数を使用して非常に優雅に行うことができます。

私はこのタスクを実行するために作った再帰関数を共有していますが、私は現在モバイルです。

0

あなたがideを使用している場合は、navigateにback()メソッドがあるかどうかを確認できます。がある !また、Googleの "selenium navigate api"を使用することもできます。次に、公式の文書http://docs.seleniumhq.org/docs/03_webdriver.jspにアクセスしてください。下を見てください:ナビゲーション:履歴と場所。

もう1つの試みは、2つのブラウザを作成することです。 1つのブラウザはすべてのリンクを含むページを保持し、他のページは各リンクを開きます。なぜ、前進してメインページをリロードし続けるのですか?欠点は、追加のブラウザを作成するために必要なメモリが増えることです。

新しいブラウザを作成する代わりに、「アクション」を使用して新しいタブを使用して新しいウィンドウを作成できます。私の限定された経験では、ウィンドウとタブの管理は容易ではなく、クロームでは信頼できない場合があります(私は独自のウィンドウハンドルを備えた2つのタブを作成し、クロムは新しいタブから前のタブに切り替えることができませんでした。

関連する問題