zoukankan      html  css  js  c++  java
  • 元素的等待

    元素的等待:

    1、有时候我们的网页,可能受到网络的影响或者是服务响应的影响,可能会出现加载比较慢的现象,需要等待一会儿才能加载完整,但是我们自动化的脚本,可能无法判断这些情况,可能会报错,有时候并不是我们网页的问题,可能是需要等一会才能打开,这就需要我们的等待操作,才能避免这种不必要的报错;

    2、有的同学可能会说用sleep,但是这里不好这个sleep是写死的,有时候可能网页已经打开了,还在那里等待,有的是3秒的时候打开,结果你设置了等待2秒

    有时候有些网络的时间是没法估算的,用sleep不能确定具体的,之前我们用sleep,只是为了,让用户更容易明白,看到的现象更明白;

    概念:
      显示等待:是针对某个元素进行相关的等待判定
      比如我们在一段5S的时间段内,定位百度的搜索框,然后只要能够判断出现百度的搜索框,就不在等待,他是针对某一个元素的;
      例如:就像我么在约定的时间内,等人一样,等到了这个人,就不在等了,等时间到了还等不到就直接不在等待;
    隐式等待:是针对某个元素进行等待,全局元素的等待
      他是针对全局的元素进行等待,并不会针对某一个元素等待,比如说脚本执行都某一个步骤,他会根据你当前执行的元素进行等待,他会把当前页面的所有的元素进行等待

    a.显示等待用到的模块:
    WebDriveWait 显示等待针对元素必用
    expected conditions 预期条件类(里面包含的方法可以调用,用于显示等待)
    NoSuchElementException 用于隐式等待抛出异常
    By用于元素定位

    需求:对百度的搜索按钮进行定位:

    
    
     1 from selenium import webdriver
     2 from selenium.webdriver.support.ui import WebDriverWait       #注意字母大写
     3 from selenium.webdriver.support import expected_conditions as EC        #as这里是对这个异常取一个别名
     4 from selenium.common.exceptions import NoSuchElementException
     5 from selenium.webdriver.common.by import By
     6 from time import sleep
    10 #检测百度搜索按钮是否存在,存在就是在输入框里面输入Python,然后点击搜索 
    12 driver=webdriver.Chrome()
    13 driver.get("http://www.baidu.com")
    14 driver.find_element_by_css_selector("#kw").send_keys("python")
    16 #在当前页面5面中内,每个0.5会检测su这个元素,直到su出现了,就会执行click
    17 element=WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID,'su123')))
    18 element.click() 
    20 sleep(3)
    21 driver.quit()
    
    

    如上上边的代码,中搜索按钮的元素随便改一下,搞成wu123,在执行上述的代码:

     1 from selenium import webdriver
     2 from selenium.webdriver.support.ui import WebDriverWait       #注意字母大写
     3 from selenium.webdriver.support import expected_conditions as EC        #as这里是对这个异常取一个别名
     4 from selenium.common.exceptions import NoSuchElementException
     5 from selenium.webdriver.common.by import By
     6 from time import sleep
     7 
     8 
     9 
    10 #检测百度搜索按钮是否存在,存在就是在输入框里面输入Python,然后点击搜索
    11 
    12 driver=webdriver.Chrome()
    13 driver.get("http://www.baidu.com")
    14 driver.find_element_by_css_selector("#kw").send_keys("python")
    15 
    16 #在当前页面5面中内,每个0.5会检测su这个元素,直到su出现了,就会执行click
    17 element=WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID,'su123')))
    18 element.click()
    19 
    20 sleep(3)
    21 driver.quit()

    执行结果:

    会报错,无法发现该元素;
    这就是显示等待;

    b.隐式等待:是针对某个元素进行等待,全局元素的等待

    需求:等待5S,百度的搜索框,里面输入Python,然后点击搜索;

     1 from selenium import webdriver
     2 from selenium.common.exceptions import NoSuchElementException
     3 from time import sleep,ctime
     4 
     5 driver=webdriver.Chrome()
     6 driver.get("http://www.baidu.com")
     7 sleep(2)
     8 #隐式等待5S
     9 driver.implicitly_wait(5)
    10 #如果查不到当前的元素就抛出一个异常
    11 try:
    12     #打印当前的时间
    13     print(ctime())
    14     driver.find_element_by_css_selector("#kw").send_keys("python")
    15     driver.find_element_by_css_selector("#su").click()
    16 except NoSuchElementException as msg:
    17     print(msg)
    18 finally:
    19     print(ctime())
    20 sleep(2)
    21 driver.quit()

    如果5S内全局没有找到对应的元素,就会报错

  • 相关阅读:
    J2SE-反射
    c3p0 连接数据库失败的问题
    c# 调用存储过程
    存储过程使用truncate时
    Parcelable intent传递对象时,需要将该对象实现Parcelable 或者Serializable
    android intent 在打开设置activity的时候在监听事件的内部 适用setclass()方法时 不是直接适用this 关键字
    c# 读取appconfig文件
    Oracle 连接数据库的几种方式
    通过反射获得方法,和绑定事件
    js 验证
  • 原文地址:https://www.cnblogs.com/surewing/p/7867163.html
Copyright © 2011-2022 走看看