配置环境变量
- 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()
测试用例
- 导入依赖
- 创建driver
- 执行自动化步骤
- 断言
- 调试的时候,最好用chrome来,不要用其他,因为其他浏览器打开网址,可能是繁体中文的,chrome是中文的
小案例
- 打开https://testerhome.com/
- 点击社团
- 点击霍尔沃兹测试
- 点击第一个帖子
具体代码
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)
测试用例
- 直接等待
from time import sleep
#强制等待5秒,单位是秒
sleep(5)
-
隐式等待
- 含义:就是在创建driver时,为浏览器对象创建一个等待时间,这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。
- self.drivers.implicitly_wait(5),单位是秒
- 这个是全局的,只要写在开头,每个代码间的等待时间都是5秒
- 如果找到的元素,就不用等待5秒
- 有时候会导致明明找到元素,但是却报错了,隐式等待估计是识别到了这个元素可见,也就是expected_conditions.visibility_of_element_located,但不关注其他元素的属性,比如可点击
-
显示等待
- 就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么久跳出Exception
- 下面的代码演示了By的使用、WebDriverWait显示等待、expected_conditions的使用
- until(里面的函数返回值只有Ture和False)
案例
- 进入https://ceshiren.com
- 点击分类
- 点击热门
具体代码
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)