web自动化--等待

一、常用知识:

一、强制等待
time.sleep(3)

二、隐式等待
语法:driver.implicitly_wait(s)
1、整个会话只执行一次,全局起作用,后面的每一次元素查找都会进行等待,在设置的时间内元素找到就执行下一行代码,元素未找到就会报错

三、显式等待(等待[WebDriverWait]+条件[expected_conditions])
1、导包
from selenium.webdriver.support.wait import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC

2、WebDriverWait参数说明
    2.1、timeout:最长超时时间,默认以秒为单位
    2.2、poll_frequency:轮询频率,检测的间隔步长,默认为0.5s,这里会每隔 0.5 秒调用一次 method 的临时函数
    2.3、ignored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception异常。

3.until()结合使用
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
"写法一:分开写"
"等待,默认0.5秒检查一次元素是否出现"
"等待条件为找到某个元素结合until使用"
wait = WebDriverWait(driver=drive,timeout=10)
element_locator = (By.XPATH,'//div[@id="kw"]')
element = wait.until(EC.visibility_of_element_located(locator=element_locator))

"写法二:组合写法"
EC.presence_of_element_located():元素存在的位置
element=WebDriverWait(driver=driver,timeout=10,poll_frequency=1).until(EC.presence_of_element_located((By.ID,'//div[@class="target_id"')))

"等待多个元素出现"
wait = WebDriverWait(driver=drive,timeout=10)
wait.until(EC.visibility_of_all_elements_located(locator=location))
  
4、until_not()结合使用

5、expected_conditions结合使用


四、from selenium.webdriver.support import expected_conditions类
https://www.cnblogs.com/surewing/p/9639855.html
"常用"
1、visibility_of_element_located : 判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于0
2、visibility_of_all_elements_located:判断多个元素是否可见,可见代表元素非隐藏,并且元素的宽和高都不等于0
3、visibility_of :跟上面的方法做一样的事情,只是上面的方法要传入locator,这个方法直接传定位到的element就好了
4、frame_to_be_available_and_switch_to_it : 判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False
5、alert_is_present : 判断页面上是否存在alert
6、element_to_be_selected:判断某个元素是否被选中了,一般用在下拉列表
7、element_to_be_clickable : 判断某个元素中是否可见并且是enable的,这样的话才叫clickable
8、presence_of_element_located: 判断某个元素是否被加到了dom树里,【并不代表该元素一定可见】
9、presence_of_all_elements_located : 等待所有元素存在dom树中【并不代表该元素一定可见】
    
    
"不常用"  
6、title_is:判断当前页面的title是否完全等于(==)预期字符串,返回是布尔值
7、title_contains 判断当前页面的title是否包含预期字符串,返回布尔值
8、text_to_be_present_in_element : 判断某个元素中的text是否包含了预期的字符串
9、text_to_be_present_in_element_value:判断某个元素中的value属性是否包含了预期的字符串
10、invisibility_of_element_located : 判断某个元素中是否不存在于dom树或不可见
11、staleness_of :等某个元素从dom树中移除,注意,这个方法也是返回True或False
12、element_selection_state_to_be:判断某个元素的选中状态是否符合预期
13、element_located_selection_state_to_be:跟上面的方法作用一样,只是上面的方法传入定位到的element,而这个方法传入locator
"""

二、测试代码:

# 导入selenium包
from selenium import webdriver
from time import sleep

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

# 打开一个浏览器
# 1、启动chromedriver驱动程序
# 2、通过驱动程序,与chrome之间创建一个会话(会话Id)。打开chrome浏览器。
driver = webdriver.Chrome()

#调整为最大窗口:
driver.maximize_window()

#打开百度地址
driver.get("https://www.baidu.com/")

# id
# element=driver.find_element(By.ID,"kw")
# print(element)

element = driver.find_element(By.XPATH,'//input[@id="kw"]')
print(element)

#点击操作
element.click()
#输入操作
element.send_keys("陈然")
#点击百度按钮查询
element1 =driver.find_element(By.ID,"su")
element1.click()
sleep(3)
#获取元素的标签名
print(element.tag_name)
#获取元素的value属性
print(element.get_attribute("value"))
#获取元素的文本内容
print(element.text)
#将元素滚动到可见区域
print(element.location_once_scrolled_into_view)

#判断元素是否被选中
print(element.is_selected())
#判断元素是否已启用
print(element.is_enabled())
#判断元素是否对用户可见
print(element.is_displayed())

#元素存在:页面存在
#元素可见:元素在页面上占据一定的大小
#元素可用:按钮置灰(不可用)



#1.强制等待(把握不了等待的时间)
sleep
#2.隐性等待(implicitly_wait) -智能等待(全局作用)
#在等待时间内元素找到了就不再等待,如果没找到就抛出异常  --等待元素,driver.find_element
driver.implicitly_wait(10)
#3.显性等待  -智能等待
#等待时间内任何条件成立了就不再等待,超出时间没找到就抛出异常
loc=(By.XPATH,'//input[@id="kw"]')
EC.visibility_of_any_elements_located(loc)
#结合起来使用场景:
WebDriverWait(driver,10).until(EC.visibility_of_any_elements_located(loc))
#不成立场景:
WebDriverWait(driver, 10).until_not()

sleep(3)
driver.quit()

 

posted @ 2023-02-27 20:26  然后呢。。。  阅读(24)  评论(0编辑  收藏  举报