Selenium waitForElement

时间:2011-10-16 01:33:12

标签: python selenium-webdriver automation automated-tests

如何为Selenium编写函数以等待Python中只有类标识符的表?我有一段时间学习使用Selenium的Python webdriver函数。

14 个答案:

答案 0 :(得分:48)

来自Selenium Documentation 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)

答案 1 :(得分:19)

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

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

为了让生活变得更简单,你可以将一些预期的条件方法与Selenium wait 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')

答案 2 :(得分:7)

我使用以下方面取得了很好的经验:

  • time.sleep(秒)
  • webdriver.Firefox.implicitly_wait(秒)

第一个非常明显 - 只需等几秒钟即可完成。

对于我的所有Selenium脚本,当我在笔记本电脑上运行时,sleep()有几秒钟(范围从1到3),但在我的服务器上,等待的时间范围更广,所以我使用implicitly_wait( )也是。我通常使用implicitly_wait(30),这已经足够了。

  

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

答案 3 :(得分:2)

我为wait_for_condition的python实现了以下内容,因为python selenium驱动程序不支持此函数。

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;")

答案 4 :(得分:1)

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

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

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

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

除非我遗漏了某些内容,否则无需为此创建新功能。

答案 5 :(得分:1)

如果这有帮助...

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

然后我做了File&gt; Export TestCase As Python2(Web Driver),它给了我这个......

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")

答案 6 :(得分:1)

您总是可以在循环中使用短暂睡眠并将其传递给您的元素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

答案 7 :(得分:1)

希望这会有所帮助

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

答案 8 :(得分:0)

如果我对selenium命令一无所知,我会使用selenium web idea RC和firefox。您可以在组合框中选择并添加命令,并在完成测试用例后可以导出测试代码不同的语言。像java,ruby,phyton,C#等。

答案 9 :(得分:0)

更简单的解决方案:

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

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

答案 10 :(得分:0)

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

“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)

答案 11 :(得分:0)

我发现了使用自定义函数构建此函数的简便方法,该函数本质上是递归的

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

答案 12 :(得分:0)

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))
)

答案 13 :(得分:0)

我希望这会有所帮助:

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)))

我建议您阅读this文章以使其更清晰。