一、Selenium安装
Python3.x 安装后就默认就会有 pip(pip.exe默认在python的Scripts路径下),打开 cmd,使用pip安装selenium:
pip install selenium
查看是否安装成功
pip show selenium
mac电脑,把 pip 换成 pip3
二、Xpath
1、id定位
Xpath在浏览器Console中可以使用$x(' ')的方式进行练习: $x('//*[@name="wd"]')
Selector在浏览器Console中可以使用$(' ')的方式进行练习: $('#kw')
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
class TestWait:
def setup(self):
self.driver = webdriver.Chrome()
self.driver.get('http://www.baidu.com/')
def test_wait(self):
# self.driver.find_element(By.CSS_SELECTOR, '#kw').send_keys("特斯拉")
# self.driver.find_element(By.CSS_SELECTOR, 'id=kw').send_keys("特斯拉")
# self.driver.find_element(By.ID, 'kw').send_keys("特斯拉")
# time.sleep(1)
# self.driver.find_element(By.ID, 'su').click()
# time.sleep(2)
self.driver.find_element(By.XPATH, '//*[@id="kw"]').send_keys("特斯拉")
time.sleep(1)
self.driver.find_element(By.XPATH, '//*[@id="su"]').click()
time.sleep(10)
self.driver.find_element(By.XPATH, '//*[@id="1"]/div/div[1]/h3/a[1]').click()
time.sleep(3)
2、鼠标单击、双击、右击、悬停、拖拽、页面滚动、表单
from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
class TestActionChains:
def setup(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.implicitly_wait(5)
def teardown(self):
self.driver.quit()
# 单击、双击、右击
def test_case_click(self):
self.driver.get("https://sahitest.com/demo/clicks.htm")
element_click = self.driver.find_element(By.XPATH, "//input[@value='click me']")
element_doubleclick = self.driver.find_element(By.XPATH, "//input[@value='dbl click me']")
element_rightclick = self.driver.find_element(By.XPATH, "//input[@value='right click me']")
aciton = ActionChains(self.driver)
aciton.click(element_click)
aciton.double_click(element_doubleclick)
aciton.context_click(element_rightclick)
sleep(3)
# 执行
aciton.perform()
sleep(3)
# 鼠标移动(悬停)
def test_move_to_element(self):
self.driver.get("http://www.baidu.com")
ele = self.driver.find_element(By.XPATH, "//*[@id='s-usersetting-top']")
action = ActionChains(self.driver)
action.move_to_element(ele)
action.perform()
sleep(3)
# 拖拽
def test_drag_drop(self):
self.driver.get("https://sahitest.com/demo/dragDropMooTools.htm")
drag_element = self.driver.find_element(By.XPATH, "//*[@id='dragger']")
drop_element1 = self.driver.find_element(By.XPATH, "/html/body/div[2]")
drop_element2 = self.driver.find_element(By.XPATH, "/html/body/div[3]")
action = ActionChains(self.driver)
action.drag_and_drop(drag_element, drop_element1).perform() # 拖拽的方式一
sleep(2)
action.click_and_hold(drag_element).move_to_element(drop_element2).release().perform() # 拖拽的方式一
sleep(2)
# 页面滚动
def test_touchAction_scrollbottom(self):
self.driver.get("https://www.baidu.com")
el = self.driver.find_element(By.ID, "kw")
el_search = self.driver.find_element(By.ID, "su")
action = ActionChains(self.driver)
el.send_keys("特斯拉")
el_search.click()
sleep(1)
js = "window.scrollTo(0, 10000)"
self.driver.execute_script(js)
sleep(3)
action.perform()
# 表单
def test_form(self):
self.driver.get("https://login.sina.com.cn/signup/signin.php?entry=homepage&entry=homepage")
name = self.driver.find_element(By.ID, "username")
pw = self.driver.find_element(By.ID, "password")
su = self.driver.find_element(By.XPATH, "//*[@id='vForm']/div[2]/div/ul/li[7]/div[1]/input")
action = ActionChains(self.driver)
name.send_keys("xiaoming")
print(name.get_attribute("value")) # 打印用户名
sleep(1)
pw.send_keys(123)
print(pw.get_attribute("value"))
sleep(1)
su.click()
sleep(1)
action.perform()
3、多窗口切换
from time import sleep
from selenium import webdriver
class TestWindows():
def test_window(self):
self.driver = webdriver.Chrome()
# 1、打开浏览器窗口
self.driver.get("https://sahitest.com/demo/")
handle = self.driver.current_window_handle
print('当前的窗口句柄是:', handle)
print('当前的url:', self.driver.current_url)
# 2、点击页面中的超链接触发多窗口
self.driver.find_element("link text", "Window Open Test").click()
sleep(2)
# 3、获取所有窗口句柄
handles = self.driver.window_handles
print('所有的窗口句柄是:', handles)
# 4、 进入新窗口
self.driver.switch_to.window(handles[1])
print('新窗口的url:', self.driver.current_url)
sleep(2)
# 5、退出新窗口
# 想去那个窗口就写哪个窗口的索引;这里就可以写handle,也可以写handles[0]
self.driver.switch_to.window(handle)
sleep(3)
# 6、关闭浏览器
self.driver.quit()
driver.window_handles获取当前打开浏览器所有窗口句柄,通常是按照顺序打开的,改方法返回的为list列表,所以可以通过返回列表的索引取出窗口句柄
driver.switch_to.window的传入参数为窗口句柄,根据上面获得的句柄,传入该方法,即可实现窗口的切换
多窗口处理知识点:
driver.window_handles,获取当前driver打开的窗口句柄列表,根据需要操作的窗口的索引使用switch_to.window()进行窗口的切换
4、网页fream
from selenium import webdriver
from selenium.webdriver.common.by import By
class TestFrames():
def setup(self):
self.driver = webdriver.Chrome()
self.driver.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
self.driver.maximize_window()
self.driver.implicitly_wait(2)
def teardown(self):
self.driver.quit()
def test_fream(self):
# 进入frame元素下
self.driver.switch_to.frame("iframeResult") # 写法一
# self.driver.switch_to_frame("iframeResult") # 写法二
print(self.driver.find_element(By.ID, "draggable"))
# 切出frame元素
# self.driver.switch_to.parent_frame() # 写法一
self.driver.switch_to.default_content() # 写法二
print(self.driver.find_element(By.ID, "submitBTN"))
frame处理知识点:
switch_to.frame,传入frame的id,即可进入对应的frame,返回上一层用parent_frame(),返回初始页面使用default_content()或者使用parent_frame()也可以
5、link_text定位
from selenium import webdriver
class TestSelenium():
def setup(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window() # 控制打开窗口
self.driver.implicitly_wait(5) # 最长等待5秒,5s后未找到元素则error
def teardown(self):
self.driver.quit()
def test_baidu(self):
self.driver.get("https://www.runoob.com/python/python-tutorial.html")
self.driver.find_element_by_link_text("Python 基础语法").click()
self.driver.find_element_by_link_text("Python 命令行参数").click()
三、selenium多浏览器处理
定义一个Base类,通过if语句判断browser传入的值而选择用什么浏览器驱动
import os
from selenium import webdriver
class Base():
def setup(self):
browser = os.getenv("browser")
if browser == 'headless':
self.driver = webdriver.PhantomJS()
elif browser == 'firefox':
self.driver = webdriver.Firefox()
else:
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.implicitly_wait(2)
def teardown(self):
self.driver.quit()
通过命令行运行:
browser=chrome pytest test_xxx.py
四、selenium执行JS
1、selenium处理JS元素
def test_js_scroll(self):
self.driver.get("http://www.baidu.com")
self.driver.find_element(By.ID, "kw").send_keys("selenium测试")
element = self.driver.execute_script("return document.getElementById('su')")
element.click()
self.driver.execute_script("document.documentElement.scrollTop=10000")
sleep(1)
self.driver.find_element(By.XPATH, "//*[@id='page']/div/a[10]").click()
sleep(2)
for code in [
'return document.title', 'return JSON.stringify(performance.timing)'
]:
self.driver.execute_script(code)
2、JS处理时间控件
def test_datetime(self):
self.driver.get("https://www.12306.cn/index/")
# 获取时间控件并移除readonly属性
self.driver.execute_script("a=document.getElementById('train_date'); a.removeAttribute('readonly')")
sleep(2)
# 将时间控件的值修改为'2028-12-25'
self.driver.execute_script("return document.getElementById('train_date').value='2028-12-25'")
sleep(3)
五、文件上传、alert弹框
from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from seleniumTest.base import Base
class TestFlie():
def setup(self):
self.driver = webdriver.Chrome()
def teardown(self):
self.driver.quit()
"""文件上传"""
def test_file_upload(self):
self.driver.get("https://image.baidu.com/")
self.driver.find_element(By.XPATH, '//*[@id="sttb"]/img[1]').click()
self.driver.find_element(By.ID, "stfile").send_keys(
"E:/python/pycharm/pythonProject/pytestdemo/seleniumTest/baidu.png")
sleep(6)
"""alter弹窗"""
def test_alter(self):
self.driver.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
self.driver.switch_to.frame("iframeResult")
drag = self.driver.find_element(By.XPATH, '//*[@id="draggable"]')
drop = self.driver.find_element(By.XPATH, '//*[@id="droppable"]')
action = ActionChains(self.driver)
action.drag_and_drop(drag, drop).perform()
sleep(4)
# 获取alert内容
text = self.driver.switch_to.alert
print(text)
# 点击alert弹框的'确认'按钮
print("点击alert弹框的'确认'按钮")
self.driver.switch_to.alert.accept()
self.driver.switch_to.default_content()
self.driver.find_element(By.ID, "submitBTN").click()
sleep(3)