保存屏幕图片
driver.save_screenshot('./screenshot/image.png')
元素截图
ele1 = driver.find_element(By.PARTIAL_LINK_TEXT, "高调")
ele1.screenshot('./screenshot/ele_image.png')
# driver.quit()
回车
from selenium.webdriver.common.keys import Keys
# driver.find_element(By.XPATH, '//input[@name="searchKey"]').send_keys('大王' + Keys.ENTER)
清除
ele1 = driver.find_element(By.XPATH, '//input[@name="searchKey"]')
ele1.send_keys('大王')
sleep(1)
ele1.clear()
下拉列表选择
1.通过index; 2.通过value; 3.通过文本
1.找到对应的选择框
2.选择选择框的选项
from selenium.webdriver.support.select import Select
driver.get(r'D:\编程相关\新起点_华测\WEB自动化系列\111.html')
select_ele = driver.find_element(By.ID, 's1Id')
select_obj = Select(select_ele)
select_obj.select_by_index(1) # 方法1
sleep(1)
select_obj.select_by_value('o2') # 方法2
sleep(1)
select_obj.select_by_visible_text('o3') # 方法3
sleep(2)
检查被选择的,返回的是元素id不是名称(好像没啥用)
all_selected = select_obj.all_selected_options
print(all_selected)
返回所有的选项,返回的是元素id不是名称
all_selection = select_obj.options
print(all_selection)
二丶多选
select_multi = driver.find_element(By.XPATH, '//*[@multiple="multiple"]')
select_multi_obj = Select(select_multi)
选择两个
select_multi_obj.select_by_index(3)
select_multi_obj.select_by_index(1)
sleep(1)
判断是否能多选
if_allow_multi = select_multi_obj.is_multiple
print(if_allow_multi)
取消选择
select_multi_obj.deselect_by_index(3)
sleep(1)
用第三方库完成一些复杂操作
from selenium.webdriver import ActionChains
from selenium.webdriver.common.actions.action_builder import ActionBuilder
from selenium.webdriver.common.actions.mouse_button import MouseButton
Actions 可以做的操作,要先移动到那里,才能操作
ele2 = driver.find_element(By.XPATH, '//*[@id="searchKey"]')
移动到元素上
ActionChains(driver).move_to_element(ele2).pause(1).click_and_hold().pause(1).send_keys('abc').perform()
Click and hold (点击并按住不放)
例子clickable
def test_click_and_hold(driver):
driver.get('https://selenium.dev/selenium/web/mouse_interaction.html')
# 演示用,实际使用删掉
sleep(1)
clickable = driver.find_element(By.ID, "clickable")
ActionChains(driver).click_and_hold(clickable).perform()
sleep(0.5)
assert driver.find_element(By.ID, "click-status").text == "focused"
test_click_and_hold(driver)
Back Click (点击后退\前进;鼠标侧键)
#例子Click for Results Page
def test_back_click_ab(driver):
driver.get('https://selenium.dev/selenium/web/mouse_interaction.html')
driver.find_element(By.ID, "click").click()
assert driver.title == "We Arrive Here"
sleep(2)
action = ActionBuilder(driver)
# action.pointer_action.pointer_down(MouseButton.BACK)
# action.pointer_action.pointer_up(MouseButton.BACK)
# action.perform()
driver.back() # 两个方法的效果一样
sleep(2)
action.pointer_action.pointer_down(MouseButton.FORWARD)
action.pointer_action.pointer_up(MouseButton.FORWARD)
action.perform()
sleep(2)
assert driver.title == "We Arrive Here"
test_back_click_ab(driver)
鼠标悬停-hover;看可能未必看得出来
def test_hover(driver):
driver.get('https://selenium.dev/selenium/web/mouse_interaction.html')
hoverable = driver.find_element(By.ID, "hover")
ActionChains(driver)\
.move_to_element(hoverable)\
.perform()
sleep(3)
assert driver.find_element(By.ID, "move-status").text == "hovered"
test_hover(driver)
Drag and Drop on Element 在元素上拖放
例子 draggable
def test_drag_and_drop_onto_element(driver):
driver.get('https://selenium.dev/selenium/web/mouse_interaction.html')
# 演示用,实际使用删掉
sleep(3)
drag = driver.find_element(By.ID, "draggable")
drop = driver.find_element(By.ID, "droppable")
ActionChains(driver)\
.drag_and_drop(drag, drop)\
.perform()
sleep(2)
assert driver.find_element(By.ID, "drop-status").text == "dropped"
test_drag_and_drop_onto_element(driver)
Drag and Drop by Offset 按偏移量拖放
例子 draggable
def test_drag_and_drop_by_offset(driver):
driver.get('https://selenium.dev/selenium/web/mouse_interaction.html')
# 演示用,实际使用删掉
sleep(3)
draggable = driver.find_element(By.ID, "draggable")
start = draggable.location
# 演示用,实际使用删掉
# 打印起始位置坐标
print("起始位置坐标")
print(start)
finish = driver.find_element(By.ID, "droppable").location
# 演示用,实际使用删掉
# 打印结束位置坐标
print("结束位置坐标")
print(finish)
# 从draggable元素开始,计算好偏移量后,按偏移量进行拖拽
# ActionChains(driver).drag_and_drop_by_offset(draggable, finish['x'] - start['x'], finish['y'] - start['y']).perform()
ActionChains(driver).drag_and_drop_by_offset(draggable, 22, 100).perform()
sleep(2)
assert driver.find_element(By.ID, "drop-status").text == "dropped"
test_drag_and_drop_by_offset(driver)
滚轮操作
from selenium.webdriver.common.actions.wheel_input import ScrollOrigin
def _in_viewport(driver, element):
script = (
"for(var e=arguments[0],f=e.offsetTop,t=e.offsetLeft,o=e.offsetWidth,n=e.offsetHeight;\n"
"e.offsetParent;)f+=(e=e.offsetParent).offsetTop,t+=e.offsetLeft;\n"
"return f<window.pageYOffset+window.innerHeight&&t<window.pageXOffset+window.innerWidth&&f+n>\n"
"window.pageYOffset&&t+o>window.pageXOffset"
)
return driver.execute_script(script, element)
最基础,这个应该是比较常见的
def test_can_scroll_to_element(driver):
driver.get("https://selenium.dev/selenium/web/scrolling_tests/frame_with_nested_scrolling_frame_out_of_view.html")
# 演示用,实际使用删掉
sleep(1)
# 定位到测试用的底部Frame,滚动到看不见的元素
iframe = driver.find_element(By.TAG_NAME, "iframe")
# 滚动到Frame
ActionChains(driver).scroll_to_element(iframe).perform()
sleep(3)
# 使用JS,按照元素的位置进行滚动,然后将JS滚动坐标和元素滚动后坐标进行比对
# 返回True或False,JS代码比较复杂,这里不纠结理解即可
assert _in_viewport(driver, iframe)
test_can_scroll_to_element(driver)
滚动到特定的坐标
def test_can_scroll_from_viewport_by_amount(driver):
driver.get("https://selenium.dev/selenium/web/scrolling_tests/frame_with_nested_scrolling_frame_out_of_view.html")
# 演示用,实际使用删掉
sleep(3)
footer = driver.find_element(By.TAG_NAME, "footer")
# 获取元素在页面的坐标x,y,从左往右,从上往下,递增
delta_y = footer.rect['y']
# 演示用,实际使用删掉
print("delta_y:")
print(delta_y)
ActionChains(driver)\
.scroll_by_amount(0, delta_y)\
.perform()
sleep(0.5)
# 使用JS,按照元素的位置进行滚动,然后将JS滚动坐标和元素滚动后坐标进行比对
# 返回True或False,JS代码比较复杂,这里不纠结理解即可
assert _in_viewport(driver, footer)
test_can_scroll_from_viewport_by_amount(driver)
Scroll from an element by a given amount 基于元素按给定数值滚动
这个例子是在frame里面滚动,这个应该是比较常见的
def test_can_scroll_from_element_by_amount(driver):
driver.get("https://selenium.dev/selenium/web/scrolling_tests/frame_with_nested_scrolling_frame_out_of_view.html")
# 演示用,实际使用删掉
sleep(3)
iframe = driver.find_element(By.TAG_NAME, "iframe")
# 定义滚动起始元素
scroll_origin = ScrollOrigin.from_element(iframe)
# scroll_from_origin 需要3个参数,第一个表示起始点(元素)
# 后面2个是delta_x和delta_y的值
ActionChains(driver)\
.scroll_from_origin(scroll_origin, 0, 200)\
.perform()
sleep(2)
test_can_scroll_from_element_by_amount(driver)
#Scroll from an element with an offset 基于元素按偏移量滚动
def test_can_scroll_from_element_with_offset_by_amount(driver):
driver.get("https://selenium.dev/selenium/web/scrolling_tests/frame_with_nested_scrolling_frame_out_of_view.html")
# 演示用,实际使用删掉
sleep(3)
# 和上个例子frame不同,这个从最底部的元素定位
footer = driver.find_element(By.TAG_NAME, "footer")
"""
定义滚动起始元素,偏移量定义如下:
传入一个x 和一个y 值来确定
向右和向下偏移多少。负值分别代表左和上
"""
scroll_origin = ScrollOrigin.from_element(footer, 0, -50)
# 元素高度292,偏移超过这个出现异常,不滚动
# scroll_origin = ScrollOrigin.from_element(footer, 0, -300)
# 元素在视窗之外,首先滚动到屏幕底部,然后通过将偏移量添加到元素中心的坐标
# 来确定滚动的原点,最后页面按提供的 delta x 和 delta y 值滚动
# 注意,如果距元素中心的偏移量落在视窗之外,则会导致异常。
ActionChains(driver)\
.scroll_from_origin(scroll_origin, 0, 200)\
.perform()
sleep(2)
# 结果检查
# iframe = driver.find_element(By.TAG_NAME, "iframe")
# driver.switch_to.frame(iframe)
# checkbox = driver.find_element(By.NAME, "scroll_checkbox")
# 使用JS,按照元素的位置进行滚动,然后将JS滚动坐标和元素滚动后坐标进行比对
# 返回True或False,JS代码比较复杂,这里不纠结理解即可
# assert _in_viewport(driver, checkbox)
test_can_scroll_from_element_with_offset_by_amount(driver)
Scroll from a offset of origin (element) by given amount
基于原点(或元素)的偏移量按给点数值滚动
def test_can_scroll_from_viewport_with_offset_by_amount(driver):
driver.get("https://selenium.dev/selenium/web/scrolling_tests/frame_with_nested_scrolling_frame.html")
# 演示用,实际使用删掉
sleep(3)
# 基于原点,偏移(20, 20)
scroll_origin = ScrollOrigin.from_viewport(20, 20)
sleep(3)
# 按给点数值(0,200)滚动
ActionChains(driver)\
.scroll_from_origin(scroll_origin, 0, 200)\
.perform()
sleep(0.5)
# 结果检查
iframe = driver.find_element(By.TAG_NAME, "iframe")
driver.switch_to.frame(iframe)
checkbox = driver.find_element(By.NAME, "scroll_checkbox")
assert _in_viewport(driver, checkbox)
键盘操作
def test_key_up(driver):
driver.get('https://selenium.dev/selenium/web/single_text_input.html')
sleep(1)
ActionChains(driver)\
.key_down(Keys.SHIFT)\
.send_keys("a")\
.key_up(Keys.SHIFT)\
.send_keys("b")\
.perform()
sleep(1)
assert driver.find_element(By.ID, "textInput").get_attribute('value') == "Ab"
test_key_up(driver)
def test_copy_and_paste(driver):
driver.get(‘https://selenium.dev/selenium/web/single_text_input.html’)
# ctrl键判断,如果是mac,使用 Keys.COMMAND,windows就用 Keys.CONTROL
cmd_ctrl = Keys.COMMAND if sys.platform == ‘darwin’ else Keys.CONTROL
"""
动作拆解:
键盘左键
shift
键盘上键
shift
按下ctrl
x 剪切
v 粘贴
v 粘贴
松开ctrl
"""
ActionChains(driver)\
.send_keys("Selenium!")\
.pause(1) \
.send_keys(Keys.ARROW_LEFT)\
.pause(1) \
.key_down(Keys.SHIFT) \
.pause(1) \
.send_keys(Keys.ARROW_UP) \
.pause(1) \
.key_up(Keys.SHIFT) \
.pause(1) \
.key_down(cmd_ctrl) \
.pause(1) \
.send_keys("xvv") \
.pause(1) \
.key_up(cmd_ctrl) \
.pause(1) \
.perform()
assert driver.find_element(By.ID, "textInput").get_attribute('value') == "SeleniumSelenium!"