【selenium】环境、用例、等待的笔记

配置环境变量

  • pip install selenium
  • 下载对应的chromedriver:CNPM Binaries Mirror
  • 添加chromedriver的环境变量
  • 再打开pycharm(如果你是打开pycharm,再配置环境是有问题的,关一次就好)

具体代码

from selenium import webdriver
from time import sleep

#这里打开浏览器
def test_selenium():
    webdriver.Chrome()
    sleep(2)
    driver.quit()

测试用例

  1. 导入依赖
  2. 创建driver
  3. 执行自动化步骤
  4. 断言
  • 调试的时候,最好用chrome来,不要用其他,因为其他浏览器打开网址,可能是繁体中文的,chrome是中文的

小案例

  1. 打开https://testerhome.com/
  2. 点击社团
  3. 点击霍尔沃兹测试
  4. 点击第一个帖子

具体代码

from selenium import webdriver
import time


class TestCase():
    #初始化打开浏览器的操作
    def setup(self):
        self.drivers=webdriver.Chrome()
        #最大化浏览器
        self.drivers.maximize_window()
        #get方法是打开url
        self.drivers.get("https://testerhome.com/")

    #用例结束后,关闭浏览器
    def teardown(self):
        self.drivers.quit()

    def test_case(self):
        #find_element_by_link_text找到社团,通过click来点击进入
        #<p>社团<p>的方式找
        self.drivers.find_element_by_link_text("社团").click()
        #每一个步骤都需要有延迟,这里用到直接等待
        time.sleep(3)
        #找到“霍格沃兹测试学院”,然后点击
        #如果使用隐式等待,会直接报错,因为隐式等待这判断这个元素有了,但不会判断这个元素是不是可点击,所以要么使用直接等待,要么使用显示等待
        self.drivers.find_element_by_link_text("霍格沃兹测试学院").click()
        #通过xpath的方式找到第一个帖子
        self.drivers.find_element_by_xpath("//a[@href='/topics/22287']").click()
        #等待5秒,看是不是真的进入了帖子
        time.sleep(5)

测试用例

  1. 直接等待
from time import sleep
#强制等待5秒,单位是秒
sleep(5)
  1. 隐式等待

    • 含义:就是在创建driver时,为浏览器对象创建一个等待时间,这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。
    • self.drivers.implicitly_wait(5),单位是秒
    • 这个是全局的,只要写在开头,每个代码间的等待时间都是5秒
    • 如果找到的元素,就不用等待5秒
    • 有时候会导致明明找到元素,但是却报错了,隐式等待估计是识别到了这个元素可见,也就是expected_conditions.visibility_of_element_located,但不关注其他元素的属性,比如可点击
  2. 显示等待

    • 就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么久跳出Exception
    • 下面的代码演示了By的使用、WebDriverWait显示等待、expected_conditions的使用
    • until(里面的函数返回值只有Ture和False)

案例

  1. 进入https://ceshiren.com
  2. 点击分类
  3. 点击热门

具体代码


from selenium import webdriver
#引用By,可以使用find_element(By.ID,"定位方式")
from selenium.webdriver.common.by import By
#WebDriverWait是使用显示等待
from selenium.webdriver.support.wait import WebDriverWait

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

    def teardown(self):
        self.driver.quit()

    def test_wait(self):
        #By.XPATH方法定位到分类,并点击
        self.driver.find_element(By.XPATH,"//*[@title='归入各种类别的所有主题']").click()
        #创建一个方法,给显示方式的until使用,这个方法必须有一个参数,参数随便写一个
        def wait(x):
            #driver.find_elements判断当前页面有一个叫"最新"的元素,是不是找到的数量大于1
            return len(self.driver.find_elements(By.XPATH,"//*[@class='table-heading']")) >=1
        #self.driver,10表示等待
        #until只接受函数,而且函数的返回值只有True和False,True才执行,False报错
        WebDriverWait(self.driver,10).until(wait)
        #点击热门
        self.driver.find_element(By.XPATH,"//*[@href='/top']").click()
        sleep(5)

具体代码,用显示等待改善用例中隐式等待找不到可点击就报错的问题

from selenium import webdriver
from selenium.webdriver.common.by import By
#使用expected_conditions,判断元素的各种属性是否在,比如可见,可点击,可输入等
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait


class TestCase():
    def setup(self):
        self.drivers=webdriver.Chrome()
        self.drivers.get("https://testerhome.com/")


    def teardown(self):
        self.drivers.quit()

    #这里是封装了显示等待的代码,只需要传入xpath的参数即可
    def Wait(self,xpath):
        WebDriverWait(self.drivers, 10).until(
            expected_conditions.element_to_be_clickable((By.XPATH, xpath)))

    def test_case(self):
        self.drivers.find_element_by_link_text("社团").click()
        #expected_conditions.element_to_be_clickable用来判断元素是否是可点击的
        #element_to_be_clickable(())要用双括号,内层的括号要放一个turple,因为element_to_be_clickable只能传一个参数,不能传两个参数
        WebDriverWait(self.drivers,10).until(expected_conditions.element_to_be_clickable((By.XPATH,"//*[@href='/hogwarts']")))
        #self.Wait("//*[@href='/hogwarts']")
        #显示等待到"霍格沃兹测试学院"这个元素可点击后,才去点击
        self.drivers.find_element_by_link_text("霍格沃兹测试学院").click()
        time.sleep(5)

4 个赞

这个笔记也太棒了吧