Selenium:与WebDriverWait&点击

时间:2012-04-12 13:33:47

标签: python selenium webdriver

我有一组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()

我跑了这个&amp;看到它的工作。但是大部分时间都失败了。点击第一个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

1 个答案:

答案 0 :(得分: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')]"

注意:我假设在示例中只是一个拼写错误,'accordion'div的结束标记应该是一个结束标记(而不是看到的开头标记)。