【问题标题】:Selenium: Timing inconsistency with WebDriverWait & clickSelenium:与 WebDriverWait & click 的时间不一致
【发布时间】:2012-04-12 13:33:46
【问题描述】:

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

【问题讨论】:

    标签: python selenium webdriver


    【解决方案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 的结束标签应该是一个结束标签(而不是看到的开始标签)。

    【讨论】:

    • 它们会导致超时,但谢谢 - 很高兴知道您可以 and 参数。我必须在 div 上调用click() 两次才能使其始终打开。我可以接受它的工作方式,但奇怪的是需要运行两次才能打开 div - 知道为什么会发生这种情况吗?
    猜你喜欢
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多