2012-04-12 20 views
0

私は典型的なアコーディオンスタイルでコンテンツを表示/非表示にするdivのセットを持っています。 HTMLはこのように見えます。Selenium:WebDriverWaitとのタイミングの不一致とクリック

<div class="accordionContainer"> 
    <div class="accordion"> 
     <h3>Click This</h3> 
     <div class="accordionContent" style="display:none"> 
     </div> 
    </div> 
    <div class="accordion"> 
     <h3>Click This</h3> 
     <div class="accordionContent" style="display:none"> 
     </div> 
    </div> 
</div> 

私は、その最初のH3を選択し、次にaccordionContentにあるリンクを開くために私のpythonを持っています。

WebDriverWait(ff, 10).until(lambda driver : driver.find_element_by_xpath("id('main_content')/div[3]/div/div/div[1]/h3[1]")).click() 

WebDriverWait(ff, 10).until(lambda driver : driver.find_element_by_xpath("id('main_content')/div[3]/div/div/div[1]/div/p/a")).click() 

私はこれを実行しました。&は動作しています。しかしほとんどの場合、失敗します。最初のdivをクリック(私はそれの上に小さな矢印を見ることができるコンテンツを表示するように回転させるが、それはすぐにデフォルトに戻りますと、私はエラーを取得するよう二回クリックされますように思われます。

[exec] selenium.common.exceptions.ElementNotVisibleException: Message: u'Element is not currently visible and so may not be interacted with' 

奇妙なことに、それはできますがあなたは同じクリックを(呼び出すと、それが動作する第二の時間をライン)、オープンをクリックするように見えますが、ないこと。

、第2のxpathはaccordionContentdisplay: blockに変更されたこと?

答えて

1

チェックするために進めることができますこのxpathはうまくいくはずです:

"//div[@class='accordionContainer']/div[@class='accordion'][1]/div[@class='accordionContent' and contains(@style, 'block')]" 

や構造はかなり安全であるならば、行うことができます:

"//div[@class='accordionContainer']/div[1]/div[contains(@style, 'block')]" 

注:私はそれを「アコーディオン」のdivの終了タグをすることになっていることを例では、単にタイプミスであると仮定しています終了タグ(見える開始タグではなく)。

+0

タイムアウトが発生しますが、おかげで、パラメータを 'と'できます。私はそれを一貫して開くには、divの 'click()'を2回呼び出す必要があります。私はそれが働く方法で生きることができますが、それが起こるかもしれない何らかのアイデアをdivを開くために2回実行する必要があることは奇妙です。 –

関連する問題