1、在切换路由之后,如果想要selenium操作的实例也跟着切换,直接再get(路由)一次就ok了,就这么简单,如果是多个页面,才是需要driver.switch_to.window(driver.window_handles[0]),driver.window_handles保存了当前所有窗口实例,指打开的页面
测试报价管理系统的代码
from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
browser: WebDriver = webdriver.Chrome()
browser.maximize_window() # 最大化窗口
# 打开链接
browser.get('http://localhost:8080/login')
browser.find_element(By.XPATH, '//*[@id="app"]/div/div/form/div[1]/div/div/input').send_keys('admin')
browser.find_element(By.XPATH, '//*[@id="app"]/div/div/form/div[2]/div/div/input').send_keys('123456')
sleep(5)
browser.find_element(By.XPATH, '//*[@id="app"]/div/div/form/div[4]/div/button[2]').click()
# 2.切换路由工作
browser.get("http://localhost:8080/home")
# 点击用户管理
browser.find_element(By.XPATH,'//*[@id="app"]/div/section/aside/ul/div[3]/div/li/ul/div[1]/li').click()
browser.find_element(By.XPATH,'//*[@id="app"]/div/section/section/main/div/div[1]/div[1]/input').send_keys('admin')
browser.find_element(By.XPATH,'//*[@id="app"]/div/section/section/main/div/div[1]/button[1]/span').click()
sleep(5)
# 点击角色管理
browser.find_element(By.XPATH,'//*[@id="app"]/div/section/aside/ul/div[3]/div/li/ul/div[2]/li').click()
sleep(5)
# 点击菜单管理
browser.find_element(By.XPATH,'//*[@id="app"]/div/section/aside/ul/div[3]/div/li/ul/div[3]/li').click()
sleep(5)
# 点击文件管理
browser.find_element(By.XPATH,'//*[@id="app"]/div/section/aside/ul/div[3]/div/li/ul/div[4]/li').click()
sleep(5)
# 把鼠标悬停在头像下拉列表那
ele = browser.find_element(By.XPATH, '//*[@id="app"]/div/section/section/header/div/div[2]/div/div/div[2]')
print(ele.text)
# 实例化鼠标
action = ActionChains(browser)
# 鼠标悬停
action.move_to_element(ele)
# 鼠标执行
action.perform()
sleep(5)
# 根据类名找到下拉列表的两个选项
buttons = browser.find_elements(By.CLASS_NAME, 'el-dropdown-menu__item')
# 点击第二个退出按钮
buttons[1].click()
sleep(10)
browser.quit()
元素定位不到出现的原因:
元素不可用,只读,不可见
通过js脚本执行让元素改变原来的属性之后再进行定位操作
元素出现动态的属性,比如id
通过手写xpath进行定位,调用判断元素开头以及结束或者内容进行定位(其实就是找规律)
其他
- 加滚动进行定位
- 元素未加载完成,使用等待完成定位
- 元素在iframe子页面中需要切换
- 元素在不同的页面中需要切换
- 警告框,选择框特殊元素标签需要进行特殊处理
元素的操作:
- 点击元素:click()
- 输入内容:send_keys()
- 清除文本:clear
元素属性获取
- 元素大小:size
- 元素文本:text
- 获取属性值:get_attribute()
- 元素是否可见:is_display
- 元素是否可用:is_enabled()
等待
因为在web中看到的元素,不一定写在html中,有可能是通过js代码的dom操作产生出来的,而js产生的元素,很可能先要获取数据,处理之后才会显示,那么不一定页面打开所有的元素就加载完全,需要有一定的等待时间。
强制等待
- 通过time.sleep(5)
- 固定等待5秒钟
隐式等待
在创建好驱动对象之后,调用隐式等待的方式传入等待时间即可
browser= webdriver.Chrome()
browser.implicitly_wait(5)
原理:
- 元素在第一次就定位到的时候不会触发隐式等待的时长,直接操作元素
- 如果第一次定位失败,那么会触发隐式等待的有效时长
- 如果在有效时长定位到元素,那么执行操作
- 如果在有效时长没有定位到元素,那么会报错:NoSuchElementException
显式等待
使用方式:
导包
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
使用
# 下面的 //div[@class='f-info'] 只是个XPATH例子
el1 = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@class='f-info']")))
原理
- 每隔一定的时间不断尝试查找元素
- 找到了就返回元素
- 未找到就会报错:TimeoutException