在自动化测试的过程中,我们找到页面元素是为了与其交互,而常见的交互方式有点击页面元素,在原始中输入字符串,获取元素包含信息等,在这我还是以百度为例简单列举下这些交互方式。

1.在input元素中输入或者清除字符串

from selenium import webdriver
import time


options = webdriver.ChromeOptions()
# executable_path 为你chromedrive的存放路径
options.add_experimental_option('excludeSwitches', ['enable-logging'])
options.add_argument("--auto-open-devtools-for-tabs")
options.add_argument("--start-maximized")
browser = webdriver.Chrome(executable_path=r'..\tool\chromedriver.exe', options = options)

browser.get("https://www.baidu.com/")
propertyOfSearchInpute = "//span/input[@id='kw']"

browser.find_element_by_xpath(propertyOfSearchInpute).send_keys('google')
time.sleep(10)
browser.find_element_by_xpath(propertyOfSearchInpute).clear()
time.sleep(10)
#browser.quit();

运行上面的代码我们可以看到的现象是,我们在百度搜索框输入了'google',等待一会之后,输入框的文本又被清除掉了。所以针对input元素可以调用send_key()\clear()两个函数实现文本的输入与清除。

2.点击元素

from selenium import webdriver
import time

options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
options.add_argument("--auto-open-devtools-for-tabs")
options.add_argument("--start-maximized")
browser = webdriver.Chrome(executable_path=r'..\tool\chromedriver.exe', options = options)

browser.get("https://www.baidu.com/")
propertyOfSearchInpute = "//span/input[@id='kw']"
propertyOfSearchButton = "//span/input[@id='su']"

browser.find_element_by_xpath(propertyOfSearchInpute).send_keys('google')
time.sleep(10)
browser.find_element_by_xpath(propertyOfSearchButton).click()
time.sleep(10)

运行上面代码代码,我们看到的是在搜索框输入google 后,我们点击了搜索按钮,网页跳转出搜索结果。

3.获取元素(文本内容、元素属性等)

名称 功能
element.text() 获取元素文本信息
element.get_attribute('class') 获取元素属性
element.get_attribute('outerHTML')/element.get_attribute('innerHTML') 获取元素对应的HTML
getTagName 获取元素的标签名
element.location 获取元素的相对位置,方法返回的值包括x、y的坐标信息
element.size 获取元素的宽度和高度信息,返回值包括width、height的宽高值
from selenium import webdriver
import time


options = webdriver.ChromeOptions()
# executable_path 为你chromedrive的存放路径
options.add_experimental_option('excludeSwitches', ['enable-logging'])
options.add_argument("--auto-open-devtools-for-tabs")
options.add_argument("--start-maximized")
browser = webdriver.Chrome(executable_path=r'..\tool\chromedriver.exe', options = options)

browser.get("https://www.baidu.com/")
propertyOfSearchButton = "//span/input[@id='su']"

element =browser.find_element_by_xpath(propertyOfSearchButton)
print("element.value:{}".format(element.get_attribute('value')))
print("element.location:{}".format(element.getLocation()))
print("element.class:{}".format(element.get_attribute('class')))

4.模拟鼠标其它操作

在实际的UI自动化过程中,我们经常想点击一些页面元素,通过执行selenium自带的click()函数会提示我们该元素不支持click操作,但是我们手动操作时却能够点击,或者我们想长按页面元素,却发现selenium基本交互函数没有合适。这是我们可以调用其ActionChains,去模拟鼠标的单击、双击、点击鼠标右键、拖拽等操作。

名称 功能
click(on_element=None) 单击鼠标左键
click_and_hold(on_element=None) 点击鼠标左键,不松开
context_click(on_element=None) 点击鼠标右键
double_click(on_element=None) 双击鼠标左键
drag_and_drop(source, target) 拖拽到某个元素然后松开
drag_and_drop_by_offset(source, xoffset, yoffset) 拖拽到某个坐标然后松开
key_down(value, element=None) 按下某个键盘上的键
key_up(value, element=None) 松开某个键
move_by_offset(xoffset, yoffset) 鼠标从当前位置移动到某个坐标
move_to_element(to_element) 鼠标移动到某个元素
move_to_element_with_offset(to_element, xoffset, yoffset) 移动到距某个元素(左上角坐标)多少距离的位置
perform() 执行链中的所有动作
release(on_element=None) 在某个元素位置松开鼠标左键
send_keys(*keys_to_send) 发送某个键到当前焦点的元素
send_keys_to_element(element, *keys_to_send) 发送某个键到指定元素

当我们调用ActionChains的方法时,其不会立即执行,而是会将所有的操作按顺序存放在一个队列里,调用perform()方法时,队列中的时间会依次执行。

#导入ActionChains
from selenium.webdriver.common.action_chains import ActionChains

#链式写法
ActionChains(browser).click_and_hold(element).perform()
ActionChains(browser).drag_and_drop_by_offset(element).perform() 

#分布写法
actions = ActionChains(browser)
actions.drag_and_drop_by_offset(element)
actions.click(element)
actions.perform()