WebDriverWait(driver,10).until(expected_conditions.element_to_be_clickable(ele))

通过追踪代码,可以发现上面的element_to_be_clickable其实也是一个方法,只不过是selenium定义好的方法。

既然可以传方法,那其实也可以传入自定义的方法。

class element_to_be_clickable(object):
""" An Expectation for checking an element is visible and enabled such that
you can click it."""
def __init__(self, locator):
self.locator = locator def __call__(self, driver):
element = visibility_of_element_located(self.locator)(driver)
if element and element.is_enabled():
return element
else:
return False

until方法源码

 def until(self, method, message=''):
"""Calls the method provided with the driver as an argument until the \
return value is not False."""
screen = None
stacktrace = None end_time = time.time() + self._timeout
while True:
try:
value = method(self._driver)
if value:
return value
except self._ignored_exceptions as exc:
screen = getattr(exc, 'screen', None)
stacktrace = getattr(exc, 'stacktrace', None)
time.sleep(self._poll)
if time.time() > end_time:
break
raise TimeoutException(message, screen, stacktrace)

举例

from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait class TestHome():
def setup(self):
# 使用Options,需要from selenium.webdriver.chrome.options import Options
chromeOptions = Options()
#9222是端口号,只要是不被占用的端口号都可以
chromeOptions.add_experimental_option('debuggerAddress', '127.0.0.1:9222')
# 使用webdriver,需要from selenium import webdriver
self.driver = webdriver.Chrome(options=chromeOptions)
# 隐式等待,是全局生效的
self.driver.implicitly_wait(3) def teardown(self):
sleep(5) # from time import sleep
self.driver.quit() def test_home(self):
self.driver.find_element(By.ID, 'menu_contacts').click() # 使用By,需要from selenium.webdriver.common.by import By
# self.driver.find_element_by_id('menu_contacts').click()
# sleep(2)
# 显式等待
# WebDriverWait(self.driver,10).until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, '.js_has_member div:nth-child(1) .js_add_member'))) # self.driver.find_element(By.CSS_SELECTOR, '.js_has_member div:nth-child(1) .js_add_member').click() # 循环去点击“添加成员”按钮
# 在until方法种传入自定义方法wait_element
WebDriverWait(self.driver, 10).until(self.wait_element) # 不是WebDriverWait(self.driver,10).until(self.wait_element()) '''
while True:
self.wait_element() '''
self.driver.find_element(By.ID, 'username').send_keys('Tom')
self.driver.find_element(By.ID, 'memberAdd_acctid').send_keys('Tom111')
self.driver.find_element(By.ID, 'memberAdd_phone').send_keys('13838383388')
self.driver.find_element(By.CSS_SELECTOR, '.js_btn_save').click() # 根据页面是否有“姓名”输入框,判断页面是否已经跳转到录入信息页面
def wait_element(self, x): # 复用until方法,所以得加x。
size = len(self.driver.find_elements(By.ID, 'username')) # 调用这个方法时,self.driver.find_elements也会受到隐式等待的影响
if size < 1:
self.driver.find_element(By.CSS_SELECTOR, '.js_has_member div:nth-child(1) .js_add_member').click()
return size >= 1

最新文章

  1. Eclipse+Maven创建webapp项目&lt;一&gt;(转)
  2. webpack中output配置项中chunkFilename属性的用法
  3. node.js 基础学习 express安装使用
  4. UzysAssetsPickerController中文化
  5. 动画--过渡函数 transition-timing-function
  6. 视频处理控件TVideoGrabber如何对屏幕进行录制/压缩
  7. [翻译]观察变换View Transform (Direct3D 9)
  8. shell脚本 gawk语言 综采话单 对账 字段核对
  9. Eclipse 修改debug当前行的颜色
  10. 批量kill mysql processlist进程
  11. 获取地理位置的html5代码
  12. C++primer(第五版)读书笔记&amp;习题解答---CHAPTER 3
  13. SJA1000寄存器设置
  14. 比较好用的sql语句
  15. 【Android基础】AndroidManifest常用权限permission整理
  16. Windows Live Writer介绍及相关问题解决
  17. ExecutorCompletionService分析及使用
  18. Pip无法卸载某些包:Cannot uninstall &#39;PyYAML&#39;.
  19. Nginx 通过 Lua + Redis 实现动态封禁 IP
  20. 转:win7下git凭据导致无法clone代码

热门文章

  1. 陀螺仪、加速度计与MPU6050的关系
  2. 一个系列搞懂YARN(1)——Yarn架构
  3. NOIP 模拟 10 考试总结
  4. Java全家桶的这些知识,不用学了
  5. .Net Core NPOI读取Excel 并转为数据实体类
  6. 【springboot】validator枚举值校验
  7. MVVMLight学习笔记(三)---数据双向绑定
  8. 输入URL后浏览器的过程
  9. PipedInputStream and PipedOutputStream example
  10. 聊聊 PC 端自动化最佳方案 - Pywinauto