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