硒 waitForElement

2025-02-27 09:06:00
admin
原创
70
摘要:问题描述:如何在 Python 中编写函数让 Selenium 等待仅具有类标识符的表?我在学习使用 Selenium 的 Python webdriver 函数时遇到了很多麻烦。解决方案 1:来自Selenium 文档 PDF:import contextlib import selenium.webdri...

问题描述:

如何在 Python 中编写函数让 Selenium 等待仅具有类标识符的表?我在学习使用 Selenium 的 Python webdriver 函数时遇到了很多麻烦。


解决方案 1:

来自Selenium 文档 PDF:

import contextlib
import selenium.webdriver as webdriver
import selenium.webdriver.support.ui as ui

with contextlib.closing(webdriver.Firefox()) as driver:
    driver.get('http://www.google.com')
    wait = ui.WebDriverWait(driver,10)
    # Do not call `implicitly_wait` if using `WebDriverWait`.
    #     It magnifies the timeout.
    # driver.implicitly_wait(10)  
    inputElement=driver.find_element_by_name('q')
    inputElement.send_keys('Cheese!')
    inputElement.submit()
    print(driver.title)

    wait.until(lambda driver: driver.title.lower().startswith('cheese!'))
    print(driver.title)

    # This raises
    #     selenium.common.exceptions.TimeoutException: Message: None
    #     after 10 seconds
    wait.until(lambda driver: driver.find_element_by_id('someId'))
    print(driver.title)

解决方案 2:

Selenium 2 的 Python 绑定有一个名为 expected_conditions.py 的新支持类,用于执行各种操作,例如测试元素是否可见。可在此处获取。

注意:截至 2012 年 10 月 12 日,上述文件已在主干中,但尚未在最新下载中,最新下载仍为 2.25。在发布新 Selenium 版本之前,您暂时可以将此文件保存在本地,然后将其包含在导入中,就像我下面所做的那样。

为了让生活更简单一点,你可以将其中一些预期条件方法与 Seleniumwait until逻辑结合起来,制作出一些非常方便的功能,类似于 Selenium 1 中提供的功能。例如,我将其放入名为 SeleniumTest 的基类中,我的所有 Selenium 测试类都对其进行了扩展:

from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
import selenium.webdriver.support.expected_conditions as EC
import selenium.webdriver.support.ui as ui

@classmethod
def setUpClass(cls):
    cls.selenium = WebDriver()
    super(SeleniumTest, cls).setUpClass()

@classmethod
def tearDownClass(cls):
    cls.selenium.quit()
    super(SeleniumTest, cls).tearDownClass()

# return True if element is visible within 2 seconds, otherwise False
def is_visible(self, locator, timeout=2):
    try:
        ui.WebDriverWait(driver, timeout).until(EC.visibility_of_element_located((By.CSS_SELECTOR, locator)))
        return True
    except TimeoutException:
        return False

# return True if element is not visible within 2 seconds, otherwise False
def is_not_visible(self, locator, timeout=2):
    try:
        ui.WebDriverWait(driver, timeout).until_not(EC.visibility_of_element_located((By.CSS_SELECTOR, locator)))
        return True
    except TimeoutException:
        return False

然后您可以在测试中轻松地使用它们,如下所示:

def test_search_no_city_entered_then_city_selected(self):
    sel = self.selenium
    sel.get('%s%s' % (self.live_server_url, '/'))
    self.is_not_visible('#search-error')

解决方案 3:

我使用过以下产品,获得了很好的体验:

  • 时间.睡眠(秒)

  • webdriver.Firefox.implicitly_wait(秒)

第一个非常明显——只需等待几秒钟即可。

对于我的所有 Selenium 脚本,当我在笔记本电脑上运行它们时,sleep() 几秒钟(范围从 1 到 3)就可以正常工作,但在我的服务器上,等待的时间范围更广,因此我也使用 implicitly_wait()。我通常使用 implicitly_wait(30),这确实足够了。

隐式等待是指当 WebDriver 尝试查找一个或多个元素(如果它们不是立即可用的)时,在一定时间内轮询 DOM。默认设置为 0。一旦设置,隐式等待将设置为 WebDriver 对象实例的生命周期。

解决方案 4:

由于 python selenium 驱动程序不支持此功能,因此我为 python 实现了以下 wait_for_condition。

def wait_for_condition(c):
for x in range(1,10):
    print "Waiting for ajax: " + c
    x = browser.execute_script("return " + c)
    if(x):
        return
    time.sleep(1)

用作

等待 ExtJS Ajax 调用不再挂起:

wait_for_condition("!Ext.Ajax.isLoading()")

设置了 Javascript 变量

wait_for_condition("CG.discovery != undefined;")

ETC。

解决方案 5:

您始终可以在循环中使用短暂睡眠并将元素 ID 传递给它:

def wait_for_element(element):
     count = 1
     if(self.is_element_present(element)):
          if(self.is_visible(element)):
              return
          else:
              time.sleep(.1)
              count = count + 1
     else:
         time.sleep(.1)
         count = count + 1
         if(count > 300):
             print("Element %s not found" % element)
             self.stop
             #prevents infinite loop

解决方案 6:

与适当的 XPath 定位器一起使用Wait Until Page Contains Element。例如,给定以下 HTML:

<body>
  <div id="myDiv">
    <table class="myTable">
      <!-- implementation -->
    </table>
  </div>
</body>

...您可以输入以下关键字:

Wait Until Page Contains Element  //table[@class='myTable']  5 seconds

除非我错过了什么,否则没有必要为此创建新功能。

解决方案 7:

如果这有帮助的话......

在 Selenium IDE 中,我添加了... 命令:waitForElementPresent 目标://table[@class='pln']

然后我执行文件>将 TestCase 导出为 Python2(Web 驱动程序),它给了我这个......

def test_sel(self):
    driver = self.driver
    for i in range(60):
        try:
            if self.is_element_present(By.XPATH, "//table[@class='pln']"): break
        except: pass
        time.sleep(1)
    else: self.fail("time out")

解决方案 8:

更简单的解决方案:

    from selenium.webdriver.common.by import By    
    import time

    while len(driver.find_elements(By.ID, 'cs-paginate-next'))==0:
        time.sleep(100)

解决方案 9:

希望这能有所帮助

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By   


driver = webdriver.Firefox()
driver.get('www.url.com')

try:
    wait = driver.WebDriverWait(driver,10).until(EC.presence_of_element_located(By.CLASS_NAME,'x'))
except:
    pass

解决方案 10:

如果我对 selenium 命令不了解,我会使用带有 Firefox 的 selenium web idea RC。您可以在组合框中选择并添加命令,完成测试用例后,您可以导出不同语言的测试代码。例如 java、ruby、phyton、C# 等。

解决方案 11:

您可以将此功能修改为所有类型的元素。下面的代码仅适用于类元素:

其中“driver”是驱动程序,“element_name”是您要查找的类名,“sec”是您愿意等待的最大秒数。

def wait_for_class_element(driver,element_name,sec):

    for i in range(sec):        
        try:
            driver.find_element_by_class_name(element_name)
            break
        except:        
            print("not yet")
            time.sleep(1)

解决方案 12:

我找到了一种更简单的方法来构建它,使用自定义函数,它本质上是递归的

from selenium import webdriver
import time

def wait_element_by_id(id_value):
    try:
        elem = driver.find_element_by_id(id_value)
    except:
        time.sleep(2)
        print 'Waiting for id '+id_value
        wait_element_by_id(id_value)

您可以find_element_by_id根据需要替换find_element_by_namefind_element_by_tag_name

解决方案 13:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait


# wait until present
WebDriverWait(driver, waittime).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, css_selector))
)

# wait until visible
WebDriverWait(driver, waittime).until(
    EC.visibility_of_element_located((By.CSS_SELECTOR, css_selector))
)

解决方案 14:

我希望这可能会有所帮助:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec

driver = webdriver.Chrome()
driver.get(myURL)
wait = WebDriverWait(driver, 10) 

wait.until(ec.presence_of_element_located((By.XPATH, myXPATH)))

我建议你读一下这篇文章,以便更加清楚。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3878  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2714  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   47  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   48  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   48  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用