06-一些键鼠和页面操作

保存屏幕图片

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!"

test_copy_and_paste(driver)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值