webUI自动化之元素及浏览器操作
一、元素定位方式
1、元素属性定位:
1 element = driver.find_element_by_id(self, 'id')
该类方法已经过时,新的方法如下:
element = driver.find_element(By.ID, 'ID 值') # 用元素的 ID 属性定位
element = driver.find_element(By.CLASS_NAME, 'classname 值') # 用元素的 CLASS_NAME 属性定位
element = driver.find_element(By.NAME, 'name 值') # 用元素的 NAME 属性定位
element = driver.find_element(By.LINK_TEXT, '元素文本值') # 用元素的 LINK_TEXT(链接文本) 定位
element = driver.find_element(By.PARTIAL_LINK_TEXT, '元素文本部分值') # 用元素的 LINK_TEXT(链接文本,部分匹配) 定位
element = driver.find_element(By.TAG_NAME, '元素标签名') # 用元素的 TAG_NAME(标签名) 定位
element = driver.find_element(By.CSS_SELECTOR, '元素 css_selector 值') # 用元素的 CSS选择器 定位,这个可以先去了解一下CSS选择的用法,也可以不用,F12可直接复制当前元素的 css属性 值
element = driver.find_element(By.XPATH, '元素 xpath 路径') # 用元素的 XPATH路径 定位,这个也可以去了解一下XPATH的语法,也可以不用,F12可直接复制当前元素的 xpath 路径
class By如下:
扩展:
二、鼠标及键盘事件
1、鼠标事件
模拟鼠标操作,需先引入 ActionChains 类,具体用法如下:
1 from time import sleep 2 from selenium import webdriver 3 from selenium.webdriver.common.by import By 4 from selenium.webdriver.common.action_chains import ActionChains # 引入 5 6 driver = webdriver.Chrome() 7 driver.get(r'https://xxx') # 打开浏览器并访问该链接,这里的链接不便展示哈 8 driver.maximize_window() 9 10 # 定位元素并操作 11 driver.find_element(By.NAME, 'username').send_keys('v-luoyang') 12 driver.find_element(By.NAME, 'password').send_keys('12456') 13 btn = driver.find_element(By.CLASS_NAME, 'el-button') 14 15 ActionChains(driver).click(btn).perform() # 单击 btn 元素,更多方法参见 ActionChains 的源码,说的非常清楚 16 17 18 # 关闭并退出浏览器 19 driver.quit()
2、键盘事件
模拟键盘操作,需先引入 Keys 模块,再使用 send_keys 方法,具体使用如下:
1 from time import sleep 2 from selenium import webdriver 3 from selenium.webdriver.common.by import By 4 from selenium.webdriver.common.keys import Keys 5 6 driver = webdriver.Chrome() 7 driver.get(r'https://xxx/') # 打开浏览器并访问该链接,这里的链接不便展示哈 8 driver.maximize_window() 9 10 # 定位元素 11 user_ele = driver.find_element(By.NAME, 'username') 12 pwd_ele = driver.find_element(By.NAME, 'password') 13 14 user_ele.send_keys('v-luoyang') # 输入值 15 user_ele.send_keys(Keys.CONTROL, 'a') # 全选 16 user_ele.send_keys(Keys.DELETE) # 删除 17 user_ele.send_keys(Keys.ENTER) # 回车 18 19 btn = driver.find_element(By.CLASS_NAME, 'el-button') 20 btn.click() 21 22 23 # 关闭并退出浏览器 24 #driver.quit()
更多的支持的键盘符号可在 Keys 类里查看
三、浏览器操作
1 from selenium import webdriver 2 3 driver = webdriver.Chrome() # 获取浏览器对象 4 driver.get(r'https://gad.dev.ztgame.com/') # 打开浏览器并访问该链接,这里的链接不便展示哈 5 driver.get(r'https://gad.dev.ztgame.com/#/creative/material') # 进入其他链接 6 driver.maximize_window() # 浏览器窗口最大化 7 driver.set_window_size(width=480, height=800) # 设置浏览器的宽高 8 name = driver.name # 获得浏览器名称 9 driver.forward() # 前进 10 driver.back() # 后退 11 driver.refresh() # 刷新 12 current_handle = driver.current_window_handle # 获取当前窗口句柄,即获取当前浏览器当前窗口的编号 13 all_handles = driver.window_handles # 获取当前浏览器所有窗口的句柄(当前浏览器指通过上面 get() 方法打开的浏览器) 14 driver.switch_to_window('句柄') # 切换当前窗口为指定的句柄的窗口 15 current_url = driver.current_url # 获取当前窗口的url 16 title = driver.title # 获取当前窗口的标题 17 page = driver.page_source # 获取当前窗口的源码 18 driver.get_screenshot_as_file('截图保存路径') # 窗口截图,保存至指定的路径 19 20 driver.close() # 关闭当前窗口 21 driver.quit() # 关闭所有窗口并退出浏览器
四、等待
1、sleep()
例:
sleep(3),强制等待,无论程序是否加载完成,必须等待3s,常用于调试,在元素定位莫名定位不到的时候用它也许可以解决问题
2、隐式等待
例:
driver.implicitly_wait(30) # 隐性等待,最长等30秒
相当于设置了一个最长等待时间,若在规定时间内找到则执行下一步,未找到则抛出NoSuchElementException;它的作用域是全局的,跟driver的生命周期相同,一般定义在父类中,用于给所有子类的页面元素设置该等待机制,设置一次,全局有效,直到 driver 实例被关闭。
PS:可以和显式等待一起使用,但建议不要一同使用。一同使用时,取决于谁设置的时间更长。
3、显式等待
显式等待一般搭配 until() 方法使用,意为直到规定时间内定位到该元素,例:
WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator)) # locator 如 locator = (By.ID, 'username')
PS:这里用到了 WebDriverWait 类与 expected_conditions 模块,这里借用一下另一个博客的(他的博客地址)
①WebDriverWait 类里主要有两个方法和一个 init 方法,具体用处可以看源码,但官方话看得我是头昏脑胀,还是看一些比较容易懂的
__init__,参数如下:
1 driver: 传入WebDriver实例,即我们上例中的driver 2 timeout: 超时时间,等待的最长时间(同时要考虑隐性等待时间) 3 poll_frequency: 调用until或until_not中的方法的间隔时间,默认是0.5秒 4 ignored_exceptions: 忽略的异常,如果在调用until或until_not的过程中抛出这个元组中的异常,则不中断代码,继续等待,如果抛出的是这个元组外的异常,则中断代码,抛出异常。默认只有NoSuchElementException。
until,参数如下:
1 method: 在等待期间,每隔一段时间(__init__中的poll_frequency)调用这个传入的方法,直到返回值不是False
2 message: 如果超时,抛出TimeoutException,将message传入异常
until_not 与 until 相反。
调用方法:
1 WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息) ,这里的可执行方法指该方法中一定要有__call()__方法,没有就会报错 TypeError: 'xxx' object is not callable
② expected_conditions 是 selenium 中的一个模块(selenium.webdriver.support.expected_conditions),主要包含了一系列的判断条件。
以下两个条件类验证title,验证传入的参数title是否等于或包含于driver.title
title_is
title_contains
以下两个条件验证元素是否出现,传入的参数都是元组类型的locator,如(By.ID, ‘kw’)
顾名思义,一个只要一个符合条件的元素加载出来就通过;另一个必须所有符合条件的元素都加载出来才行
presence_of_element_located
presence_of_all_elements_located
以下三个条件验证元素是否可见,前两个传入参数是元组类型的locator,第三个传入WebElement
第一个和第三个其实质是一样的
visibility_of_element_located
invisibility_of_element_located
visibility_of
以下两个条件判断某段文本是否出现在某元素中,一个判断元素的text,一个判断元素的value
text_to_be_present_in_element
text_to_be_present_in_element_value
以下条件判断frame是否可切入,可传入locator元组或者直接传入定位方式:id、name、index或WebElement
frame_to_be_available_and_switch_to_it
以下条件判断是否有alert出现
alert_is_present
以下条件判断元素是否可点击,传入locator
element_to_be_clickable
以下四个条件判断元素是否被选中,第一个条件传入WebElement对象,第二个传入locator元组
第三个传入WebElement对象以及状态,相等返回True,否则返回False
第四个传入locator以及状态,相等返回True,否则返回False
element_to_be_selected
element_located_to_be_selected
element_selection_state_to_be
element_located_selection_state_to_be
最后一个条件判断一个元素是否仍在DOM中,传入WebElement对象,可以判断页面是否刷新了
staleness_of