selenium等待方式

直接等待 [不推荐]

强制等待,线程休眠一定的时间。

time.sleep(3)
实例:打开测试人网页,点击“所有分类”,检查该按钮的源码,以title作为定位器;检查“热门”按钮的源码,以title作为定位器

用 “所有分类” 的xpath作为定位器。这里是://*[@title="所有分类"]

image

from selenium import webdriver
from time import sleep

from selenium.webdriver.common.by import By


class TestWait:
    def setup(self):
        self.driver = webdriver.Chrome()
        self.driver.get('https://ceshiren.com/')
    
    
    # 直接等待
    def test_wait(self):
        # 用 “所有分类” title的xpath作为定位器。这里是://*[@title="所有分类"]
        self.driver.find_element(By.XPATH,'//*[@title="所有分类"]').click()     #点击"所有分类"
        sleep(3)
        self.driver.find_element(By.XPATH,'//*[@title="在最近的一年,一月,一周或一天最活跃的话题"]').click()      #点击 "热门"
        sleep(3)
        print("hello")

隐式等待

隐式等待,设置一个等待时间,轮询查找(默认0.5秒)元素是否出现。若在所给时间内出现了,就自动跳出死循环;如果到时间没有出现,则抛出异常。

self.driver.implicity_wait(3)

但是,隐式等待作用域:全局

from selenium import webdriver
from time import sleep

from selenium.webdriver.common.by import By


class TestWait:
    def setup(self):
        self.driver = webdriver.Chrome()
        self.driver.get('https://ceshiren.com/')
        # 添加动态等待:隐式等待
        self.driver.implicitly_wait(3)


    def test_wait(self):
        self.driver.find_element(By.XPATH, '//*[@title="所有分类"]').click()  # 点击"所有分类"
        self.driver.find_element(By.XPATH, '//*[@title="在最近的一年,一月,一周或一天最活跃的话题"]').click()  # 点击 "热门"

显式等待

在代码中定义等待条件,当条件发生时才会继续执行代码

'WebDriverWait'配合 until( )和 until_not( )方法使用,根据判断条件进行等待

程序每隔一段时间(默认时间是0.5秒)进行条件判断。如果条件成立,则执行下步操作;否则继续等待,直到超过设置的最长时间。

自定义等待函数:

from selenium import webdriver
from time import sleep

from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait


class TestWait:
    def setup(self):
        self.driver = webdriver.Chrome()
        self.driver.get('https://ceshiren.com/')

    def test_wait(self):
        self.driver.find_element(By.XPATH, '//*[@title="测试答疑"]').click()  # 点击"测试答疑"

        """自定义函数,一定要有一个参数。因为until调用wait时传给它一个参数"""
        def wait(x):
      # 点击“测试答疑”后,检查“回复”有没有出现?如果出现了,就下一步操作:点击“热门”;如果没有就一直等待
            return len(self.driver.find_elements(By.XPATH,'//*[@class="posts sortable num"]')) >= 1

        WebDriverWait(self.driver,10).until(wait)
        self.driver.find_element(By.XPATH, '//*[@title="在最近的一年,一月,一周或一天最活跃的话题"]').click()  # 点击 "热门"

我们不用每次都自定义一个等待函数,可以使用selenium自带的函数来设置等待。

例如:用selenium提供的:直到元素可点击expected_conditions.element_to_be_clickable()方法。只需往里传一个定位器locator。

from selenium import webdriver
from time import sleep

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


class TestWait:
    def setup(self):
        self.driver = webdriver.Chrome()
        self.driver.get('https://ceshiren.com/')
        # 添加动态等待:隐式等待
        # self.driver.implicitly_wait(3)


    def test_wait(self):
        self.driver.find_element(By.XPATH, '//*[@title="测试答疑"]').click()   WebDriverWait(self.driver,10).until(expected_conditions.element_to_be_clickable((By.XPATH,
                                                                                        '//*[@class="posts sortable num"]')))
        self.driver.find_element(By.XPATH, '//*[@title="在最近的一年,一月,一周或一天最活跃的话题"]').click()  # 点击 "热门"
posted @ 2021-06-17 22:19  甜梦午  阅读(54)  评论(0)    收藏  举报