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

CSV文件:格式是文本格式(注意:数据必须使用英文逗号隔开,不能用中文逗号),但是打开是一个表格的视图