gpt4 book ai didi

python - 如何让 Selenium Web 驱动程序等待元素可访问,而不仅仅是存在?

转载 作者:IT老高 更新时间:2023-10-28 22:12:25 25 4
gpt4 key购买 nike

我正在为 Web 应用程序编写测试。一些命令会弹出对话框,这些对话框具有可见的控件,但有一段时间不可用。 (它们是灰色的,但 webdriver 仍然认为它们是可见的)。

我如何告诉 Selenium 等待元素实际可访问,而不仅仅是可见?

    try:
print "about to look for element"
element = WebDriverWait(driver, 10).until(lambda driver : driver.find_element_by_id("createFolderCreateBtn"))
print "still looking?"
finally: print 'yowp'

这是我尝试过的代码,但它在按钮可用之前“看到”按钮,并且基本上在假定的“等待”之后收费。

请注意,我可以在代码中填充 10 秒的 sleep 时间,而不是这样,代码会正常工作,但这是丑陋、不可靠且效率低下的。但它确实证明了问题只是“点击”命令在控件的可用性之前竞争。

最佳答案

我假设事件时间线是这样的:

  1. 页面上没有需要的元素。
  2. 需要的元素出现,但被禁用:
    <input type="button" id="createFolderCreateBtn" disabled="disabled" />
  3. 需要的元素被启用:
    <input type="button" id="createFolderCreateBtn" />

目前您正在按 id 搜索元素,并且您在第 2 步中找到了一个,这比您需要的要早。你需要做的是通过xpath搜索它:

//input[@id="createFolderCreateBtn" and not(@disabled)]

这就是区别:

from lxml import etree


html = """
<input type="button" id="createFolderCreateBtn" disabled="disabled" />
<input type="button" id="createFolderCreateBtn" />
"""

tree = etree.fromstring(html, parser=etree.HTMLParser())

tree.xpath('//input[@id="createFolderCreateBtn"]')
# returns both elements:
# [<Element input at 102a73680>, <Element input at 102a73578>]


tree.xpath('//input[@id="createFolderCreateBtn" and not(@disabled)]')
# returns single element:
# [<Element input at 102a73578>]

总结一下,这里是你的固定代码:

try:
print "about to look for element"
element_xpath = '//input[@id="createFolderCreateBtn" and not(@disabled)]'
element = WebDriverWait(driver, 10).until(
lambda driver : driver.find_element_by_xpath(element_xpath)
)
print "still looking?"
finally:
print 'yowp'

更新:
用实际的 webdriver 重新粘贴。
这是example.html页面代码:

<input type="button" id="createFolderCreateBtn" disabled="disabled" />
<input type="button" id="createFolderCreateBtn" />

这是 ipython session :

In [1]: from selenium.webdriver import Firefox

In [2]: browser = Firefox()

In [3]: browser.get('file:///tmp/example.html')

In [4]: browser.find_elements_by_xpath('//input[@id="createFolderCreateBtn"]')
Out[4]:
[<selenium.webdriver.remote.webelement.WebElement at 0x103f75110>,
<selenium.webdriver.remote.webelement.WebElement at 0x103f75150>]

In [5]: browser.find_elements_by_xpath('//input[@id="createFolderCreateBtn" and not(@disabled)]')
Out[5]:
[<selenium.webdriver.remote.webelement.WebElement at 0x103f75290>]

更新 2:

它也适用于此:

<input type="button" id="createFolderCreateBtn" disabled />

关于python - 如何让 Selenium Web 驱动程序等待元素可访问,而不仅仅是存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9161773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com