2012-04-12 4 views
0

Ich habe eine Reihe von Divs, um Inhalte in einem typischen Akkordeon-Stil anzuzeigen/auszublenden. Das HTML sieht so aus;Selen: Timing-Inkonsistenz mit WebDriverWait & Klick

<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> 

Ich habe dann meinen Python, dass die erste H3 auszuwählen und dann einen Link zu öffnen, die in accordionContent ist.

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() 

Ich habe diese & gesehen es funktioniert. Meistens schlägt es jedoch fehl. Die erste div wird geklickt (ich einen kleinen Pfeil sehe auf ihn drehen, um den Inhalt zu zeigen, aber es scheint zweimal zu bekommen geklickt, da sie sofort auf Standard zurück und erhalte ich die Fehler;

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

Merkwürdig allerdings, wenn es kann gesehen werden angeklickt werden, aber nicht geöffnet, wenn Sie die gleiche Taste() aufrufen, ein zweites Mal die Linie es funktioniert.

Kann das zweite XPath überprüfen vorgeschoben werden, dass die accordionContent-display: block?

Antwort

1

geändert wurde Dieser XPath sollte funktionieren:

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

oder wenn die Struktur ziemlich sicher ist, könnte tun:

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

Anmerkung: Ich gehe davon aus, dass es nur ein Tippfehler in dem Beispiel ist, dass der End-Tag für das ‚Akkordeon‘ div sein sollte ein schließendes Tag (und nicht das zu öffnende Tag).

+0

Sie verursacht Timeouts, aber danke - gut zu wissen, können Sie 'und' die Parameter. Ich muss das 'click()' auf dem div zweimal aufrufen, um es konsequent zu öffnen. Ich kann mit der Art und Weise leben, wie es funktioniert, aber es ist seltsam, dass man zweimal laufen muss, um das div zu öffnen - irgendwelche Ideen, warum das passieren könnte? –

Verwandte Themen