Selenium 自动化测试(三)
Selenium WebDriver 对应的角色
- 工程师写自动化测试代码:发请求给浏览器驱动
- 浏览器驱动:解析代码后发生至浏览器
- 浏览器:执行浏览器驱动发来的指令,最终完成工程师定义的操作
Selenium WebDriver 和浏览器的通信
Selenium WebDriver 协议
webDriver 使用的协议是:JSON Wire protocol
数据格式是:JSON
Selenium WebDriver
Selenium WebDriver 常用属性
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
class TestCase(object):
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.get('http://www.baidu.com')
self.driver.maximize_window()
def test_prop(self):
print(f"driver name is: {self.driver.name}")
print(f"driver title is: {self.driver.title}")
print(f"driver title is: {self.driver.current_url}")
sleep(3)
self.driver.quit()
if __name__ == '__main__':
case = TestCase()
case.test_prop()
执行结果为:
C:\Python3.7.6\python.exe C:\Users\yolan\PycharmProjects\pythonProject\Demo.py
driver name is: chrome
driver title is: 百度一下,你就知道
driver title is: https://www.baidu.com/
Process finished with exit code 0
Selenium WebDriver 常用动作
Browser的回退 back,刷新 refresh,前进 forward 和关闭 close/quit
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
class TestCase(object):
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.get('http://www.baidu.com')
self.driver.maximize_window()
def test(self):
sleep(3)
self.driver.find_element(By.ID, 'kw').send_keys('selenium')
sleep(3)
self.driver.find_element(By.ID, 'su').click()
sleep(3)
self.driver.back() #回退
sleep(3)
self.driver.refresh() #刷新
sleep(3)
self.driver.forward() #前进
sleep(3)
self.driver.close() #关闭当前tab
sleep(3)
self.driver.quit() # 推出浏览器,关闭所有
if __name__ == '__main__':
case = TestCase()
case.test()
Browser 多个 tab 间切换
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
class TestCase(object):
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.get('http://www.baidu.com')
self.driver.maximize_window()
def test_switch(self):
self.driver.find_element(By.LINK_TEXT, '新闻').click()
windows = self.driver.window_handles
i = 0
while i < 10:
for w in windows:
self.driver.switch_to.window(w)
i += 1
sleep(2)
self.driver.close()
self.driver.quit()
if __name__ == '__main__':
case = TestCase()
case.test_switch()
Selenium WebElement
Selenium WebElement 属性
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
class TestCase(object):
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.get('http://www.baidu.com')
self.driver.maximize_window()
def testWebElement(self):
e = self.driver.find_element(By.ID, 'kw')
e.send_keys('selenium')
print(f"ID is: {e.id}")
print(f"size is: {e.size}")
print(f"rect is: {e.rect}")
print(f"tag is: {e.tag_name}")
print(f"text is: {e.text}")
if __name__ == '__main__':
case = TestCase()
case.testWebElement()
执行结果:
C:\Python3.7.6\python.exe C:\Users\yolan\PycharmProjects\pythonProject\Demo.py
ID is: 0dc98c86-d2bc-4c62-a408-6b7017482e8c
size is: {'height': 38, 'width': 503}
rect is: {'height': 38, 'width': 503, 'x': 765, 'y': 17}
tag is: input
text is:
Process finished with exit code 0
Selenium WebElement 动作
下拉列表常用方法
Selenium 弹出框
- Alter:提示
- Confirm:确认
- Prompt:输入内容
Selenium 等待
Selenium 等待方式
-
固定等待: time.sleep,不建议用于实际运行脚本;建议脚本调试过程使用,方便快捷
-
implicitly_wait/隐式等待: 对整个driver起作用,在最开始设置一次就可以
self.driver.implicitly_wait(10)
-
WebDriverWait/显示等待:两个方法 util 和util_not
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class TestCase(object):
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.get('http://www.baidu.com')
self.driver.maximize_window()
def testWait(self):
wait = WebDriverWait(self.driver, 2)
wait.until(EC.title_is('百度一下,你就知道'))
self.driver.find_element(By.ID, 'kw').send_keys('selenium')
self.driver.find_element(By.ID, 'su').click()
sleep(3)
self.driver.quit()
if __name__ == '__main__':
case = TestCase()
case.testWait()
Selenium 等待条件
Selenium 鼠标和键盘事件
封装在ActionChains类中
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class TestCase(object):
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.get('http://www.baidu.com')
self.driver.maximize_window()
def test_mouse(self):
self.driver.find_element(By.ID, 'kw').send_keys('selenium')
btn = self.driver.find_element(By.ID, 'su')
ActionChains(self.driver).click(btn).perform()#单击
sleep(2)
ActionChains(self.driver).double_click(btn).perform()#双击
sleep(2)
ActionChains(self.driver).context_click(btn).perform()#点击右键
sleep(2)
self.driver.quit()
if __name__ == '__main__':
case = TestCase()
case.test_mouse()