python+appium里的等待时间

 

# -*- coding:utf-8 -*-

"""
implicitly_wait():隐式等待
当使用了隐士等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常
换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0
一旦设置了隐式等待,则它存在整个 WebDriver 对象实例的声明周期中,隐式的等到会让一个正常响应的应用的测试变慢,
它将会在寻找每个元素的时候都进行等待,这样会增加整个测试执行的时间。
"""

from selenium import webdriver
import time

driver = webdriver.Firefox()
driver.get('http://demo.tutorialzine.com/2009/09/simple-ajax-website-jquery/demo.html')

#等待10秒
driver.implicitly_wait(10)
driver.find_element_by_link_text("Page 4").click()

message = driver.find_element_by_id('pageContent')
#等待 Ajax 的内容出现
time.sleep(4)
print "Nunc nibh tortor" in message.text

 

为什么要用等待时间:

  1. 今天在写App的自动化的脚本时发现一个元素,时而能点击,时而又不能点击到,很是心塞,原因是:因为元素还没有被加载出来,查找的代码就已经被执行了,自然就找不到元素了.解决方式:可以用等待,等元素加载完成后再执行查找元素语句。

Python里有三种等待的方式:

强制等待

 from time import sleep

 sleep(10) # 表示强行等待10s在执行下一句代码

 driver.findelementby(id)

这种等待方式时间到了就会执行下个语句,但比较死板,不能保证在等待的时间内元素真正被加载了出来。

 隐性等待

  1. Implicitly_wait(xxx)
  2. 这个等待表示在规定的时间内页面的所有元素都加载完了就执行下一步,否则一直等到时间截止,然后再继续下一步。
  3. driver.implicitly_wait(10)#等待10s
  4. driver.find_element_by_id(common_util.get_id_value('IMAGEID')).click()
  5. 这个方法的缺点是你需要的元素已经加载出来了,但页面还没有加载完,再需要继续等待页面加载完才能执行下一步操作。

显性等待

  1. WebDriverWait,配合该类的until()和until_not()方法,表示程序每隔x秒去判断一下指定的元素是否加载完,加载完了就执行下一步,否则继续每隔x秒去判断,指定时间截止。如果超时就会抛出异常。
  2. 需要导入的包
  a)from selenium import webdriver  
  b)from selenium.webdriver.support.wait import WebDriverWait 
  c)from selenium.webdriver.support import expected_conditions as EC 
  d)from selenium.webdriver.common.by import By
  locator=(By.XPATH,”xxxxxxx”)
  d = webdriver.Chorme()
  d.get(“http://www.sina.com”)
  WebDriverWait(d,10,1).unitl(EC.presence_of_element_located(locator))

  WebDriverWait(driver, 30, 0.5).until(EC.visibility_of_element_located((By.ID,common_util.get_id_value('MYID'))))

3. 这里表示等待30s,每隔0.5s去检查一次元素是否出现,出现了就执行下一步,直到30s结束后还没有出现就会抛出异常。

实例讲解: https://www.cnblogs.com/yuuwee/p/6635652.html

参考博客: http://blog.51cto.com/laomomo/2073418

 

<think>好的,用户想要在Python中实现一个20秒的倒计时,并且要打印进度。首先,我得想想有哪些方法可以实现倒计时。记得之前学过的time模块应该可以用,面有sleep函数可以暂停程序执行。 用户需要的是倒计时,所以应该从20开始,每秒减少,直到0。首先得考虑如何每隔一秒打印一次剩余时间。可能需要一个循环,循环变量从20到0,每次循环间隔一秒。这时候可以用for循环,比如range(20, -1, -1),不过步长是-1,这样就能从20到0了。不过要注意,range的结束值是不包含的,所以结束应该是-1,这样0会包含进去。 然后,每次循环的时候,需要打印剩余时间,并且等待一秒。这时候用time.sleep(1)来实现等待。但需要注意的是,如果循环体内的代码执行时间加上sleep的时间超过一秒,可能会导致时间不准确。不过对于简单的倒计时来说,这个问题应该不大。 另外,用户提到要打印进度,可能是指每次打印剩余秒数的同时,显示进度条或者类似的东西。不过根据示例中的代码,比如引用2的倒计时是每隔10秒打印一次,用户这可能需要每秒打印一次。所以可能需要调整一下循环的步长,改为每秒一次。 现在考虑代码结构。导入time模块,然后写一个循环,从20到0,每次打印剩余秒数,然后sleep(1)。但如何让打印的内容在同一行更新呢?比如显示“剩余时间:20秒”,然后变成“剩余时间:19秒”,而不是每次都换行。这时候可以用\r来回到行首,并且设置end参数为'',避免换行。不过需要注意,有些终端可能不支持这样的操作,或者可能需要刷新缓冲区,所以可能需要加上flush=True。 比如,可以这样写: print(f"\r剩余时间:{i}秒", end='', flush=True) 这样每次打印都会覆盖前一次的内容,看起来像是在更新同一行。当倒计时结束时,可能需要换行,所以最后打印一个换行符。 然后,用户的需求是20秒的等待时间,并打印倒计时。这样实现应该可以满足。另外,考虑到用户可能希望倒计时精确到秒,而time.sleep(1)可能会有微小误差,但对于大多数情况来说是可以接受的。 测试一下代码,比如运行的时候是否每秒正确显示,最后是否到0。另外,处理一下i=0的情况,可能需要最后的打印。 现在,综合这些思考,写出代码示例。同时,参考用户提供的引用中的例子,比如引用2中的代码使用了range(start, -1, -10),这需要调整步长为-1,并且处理每秒的情况。还有引用4提到使用datetime模块计算时间差,但这可能不需要,因为只需要简单的秒数倒计时,用time模块更简单。 所以最终的代码可能如下: import time for i in range(20, -1, -1): print(f"\r剩余时间:{i}秒", end='', flush=True) time.sleep(1) print() # 换行 这样应该可以实现每秒钟更新一次剩余时间,并在同一行显示。当倒计时结束后换行,避免之后的输出在同一行。 检查一下循环的范围是否正确。range(20, -1, -1)会生成20,19,...,0,共21个数字,但循环内每次都会sleep(1),所以总时间是20秒吗?因为第一次打印20,然后等待1秒,然后打印19,直到打印0的时候,已经过去了20秒。因为循环次数是21次,但最后一次打印0后,没有等待,所以总时间应该是20秒。比如,i从20到0,每次循环执行sleep(1),所以20次等待,对吗?不,range(20,-1,-1)是21个元素(包括20到0),所以循环会执行21次,每次循环中执行sleep(1)。所以总时间是20秒?或者21秒? 这可能有问题,比如,第一次打印20,然后等待1秒,变成19,再等待1秒,直到最后打印0的时候,已经执行了20次sleep(1),所以总时间是20秒。但是循环次数是21次,因为包括0。这时候,可能需要在循环外处理第一次打印,或者调整循环的次数。 或者,或许应该从19开始,这样循环次数是20次,但这样初始显示的是19秒,可能不对。所以可能需要在循环开始前打印20,然后在循环中从19到0,循环次数20次,每次等待1秒,总时间20秒。这样可能更准确。例如: print("剩余时间:20秒", end='', flush=True) for i in range(19, -1, -1): time.sleep(1) print(f"\r剩余时间:{i}秒", end='', flush=True) time.sleep(1) # 等待最后1秒到0? print("\r剩余时间:0秒", flush=True) 但这样可能比较复杂。或者,保持原来的循环,但意识到总时间会是20秒,因为当i=20的时候,打印后立即等待1秒,然后i=19,依此类推,直到i=0的时候,打印后循环结束,此时总等待次数是20次,所以总时间20秒。这样是正确的。所以原代码是正确的。 所以最终的代码应该是正确的。用户的问题可能已经解决。同时,根据引用中的例子,比如引用2中的代码处理了i小于10的情况,但用户的问题中可能不需要,但如果有需要,可以添加类似的处理,比如显示两位数字,但用户只要求20秒,可能不需要。不过示例中的代码没有处理这个,所以保持简单。 最后,确保代码语法正确,比如import time,使用flush参数在print函数中,这在Python3中是可行的。</think>在Python中实现20秒倒计时并打印进度,可以通过以下步骤完成: ### 步骤说明 1. **导入`time`模块**:用于控制时间间隔 2. **循环倒计时**:从20秒到0秒,每次递减1秒 3. **打印进度**:通过`\r`实现同一行动态更新,并添加`flush=True`确保实时显示 4. **格式处理**:秒数小于10时显示为两位数(如"09秒") ### 代码实现 ```python import time print("倒计时开始:") for i in range(20, -1, -1): if i < 10: time_str = f"0{i}" # 格式化显示为两位数 else: time_str = str(i) print(f"\r剩余时间:{time_str}秒", end="", flush=True) if i > 0: # 最后一次无需等待 time.sleep(1) print("\n倒计时结束!") ``` ### 代码解析 - `range(20, -1, -1)`:生成20到0的整数序列 - `\r`:将光标移动到行首,实现覆盖效果 - `flush=True`:强制立即输出,避免终端缓冲延迟 - `time.sleep(1)`:每次循环暂停1秒(最后一次循环跳过) ### 输出效果 ``` 倒计时开始: 剩余时间:20秒 → 19秒 → ... → 00秒 倒计时结束! ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值