Selenium:与WebDriverWait的计时不一致,然后单击



>我有一组div以典型的手风琴风格显示/隐藏内容。HTML 看起来像这样;

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

,我让我的python选择第一个H3,然后打开一个accordionContent的链接。

 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'

奇怪的是,虽然可以看到它被单击但未打开,如果您第二次调用相同的 click() 行,它可以工作。

是否可以推进第二个 xpath 以检查accordionContent是否已更改为display: block

这个 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 的结束标签应该是结束标签(而不是看到的开始标签)。

最新更新