• webdriver中的定位模拟及实例


    Selenium webdriver

    下载

    pip install selenium
    pip install -i https://pypi.doubanio.com/simple/ selenium  # 备用地址
    

    浏览器驱动下载

    还需要安装浏览器驱动,比较常见的浏览器我们一般选用Chrome和Firefox了,当然IE和Safari也有自己的驱动:
    Chrome驱动地址:https://npm.taobao.org/mirrors/chromedriver,或者参见http://chromedriver.storage.googleapis.com/index.html
    firefox驱动地址:https://github.com/mozilla/geckodriver/releases
    IE驱动地址:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
    Safari驱动地址:https://webkit.org/blog/6900/webdriver-support-in-safari-10/
    

    下载与Chrome浏览器版本相对于的驱动,若没有即下载版本相近的驱动即可

    测试

    from selenium import webdriver
    import time
    driver = webdriver.Chrome()  #创建Chrome WebDriver实例,此路径为驱动程序的路径
    driver.get("https://www.baidu.com/")   #加载URL网页
    print(driver.title)   #打印当前页面的title属性内容
    driver.maximize_window()  #页面最大化
    input_obj1 = driver.find_element_by_id('kw')   #找到输入框的id
    input_obj1.send_keys('Na_years 博客园')   #输入要搜索的内容
    driver.find_element_by_id('su').click()   #找到查找的按钮并click进行点击
    time.sleep(2)
    driver.close()  #关闭当前窗口
    

    可以看到打开一个浏览器,然后很快就关闭了,本地也打印出了结果,表示安装成功!

    Webdriver常用方法

    from selenium import webdriver
    driver = webdriver.Chrome()  #创建Chrome WebDriver实例,默认会自动查找驱动
    #driver = webdriver.Firefox()  #火狐
    #driver = webdriver.Chrome(executable_path=r'驱动执行文件的绝对路径')  #创建Chrome WebDriver实例,此路径为驱动程序的路径
    driver.get("https://www.baidu.com/")   #加载URL网页
    print(driver.title)   #打印当前页面的title属性内容
    print(driver.page_source)   #获取当前页面的文本内容
    print(driver.name)  #获取driver对象  #chrome
    print(driver.current_url)   #获取当前页面的url
    print(driver.current_window_handle)  #获取当前窗口
    print(driver.window_handles)  #获取所以窗口
    driver.maximize_window()  #页面最大化
    input_obj1 = driver.find_element_by_id('kw')   #找到输入框的id
    input_obj = driver.find_element_by_id('kw').clear()   #将输入框的内容清空
    input_obj1.send_keys('Na_years 博客园')   #输入要搜索的内容
    driver.find_element_by_id('su').click()   #找到查找的按钮并click进行点击
    driver.find_element_by_xpath('//*[@id="1"]/h3/a').click()   #找到查找出的第一个选项并进行click点击
                        # #xpath为在网页F12检查出找到对象标签进行copy的xpath
    driver.execute_script('alert("xxoo")')   #执行js代码
    res3 = driver.save_screenshot("3.png")  #直接截屏并保存
    res1 = driver.get_screenshot_as_png()  #获取截屏的字节流,需要自己保存
    with open("1.png",'wb') as f:
        f.write(res1)    #将截图进行保存
    driver.refresh()   #刷新当前页面
    driver.back()    #后退上一个页面
    driver.forward()    #前进一个页面
    driver.minimize_window()  #页面最小化
    driver.set_window_size(800,600)  #指定页面大小
    driver.close()  #关闭当前窗口
    driver.quit() #关闭浏览器
    

    元素定位

    要区分开find_elements还是find_element,加s是找多个

    id定位

    import time
    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.get('https://pythonav.com/login/')
    # id定位
    driver.find_element_by_id('su')
    # driver.find_elements_by_id()
    

    class定位

    # class
    driver.find_element_by_class_name('xxx')
    driver.find_elements_by_class_name('xxx')
    

    xpath定位

    driver.find_element_by_xpath('xxx')
    driver.find_elements_by_xpath('xxxx')
    ###实例
    import time
    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.get('https://pythonav.com/login/')
    driver.find_element_by_xpath('//*[@id="id_code"]').send_keys('xxxxxxxx')
    

    css定位

    driver.find_element_by_css_selector('xx')
    driver.find_elements_by_css_selector('xx')
    ###实例:
    import time
    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.get('https://pythonav.com/login/')
    driver.find_element_by_css_selector('#id_username').send_keys('xxx')
    input_list = driver.find_elements_by_css_selector('.form-control')
    print(input_list)
    input_list[1].send_keys('aaaaaa')
    input_list[2].send_keys('xxxxx')
    driver.find_element_by_css_selector('input[name="code"]').send_keys('xxx')
    driver.find_element_by_css_selector('input[id="id_code"]').send_keys('xxx')
    time.sleep(3)
    driver.quit()
    

    标签定位

    driver.find_element_by_tag_name('div')
    driver.find_elements_by_tag_name('div')
    ###实例
    import time
    from selenium import webdriver
    browser = webdriver.Chrome()
    browser.get('https://www.luffycity.com/home')
    # 获取span的外部nav标签
    nav = browser.find_element_by_tag_name(name='nav')
    # 然后再获取nav内部的所有span标签
    span_list = nav.find_elements_by_tag_name(name='li')
    for i in span_list:
        i.click()
        time.sleep(3)
    time.sleep(3)
    browser.quit()
    

    a标签的link属性

    driver.find_element_by_link_text('xxx')
    driver.find_elements_by_link_text('xxx')
    driver.find_element_by_partial_link_text('xx')
    driver.find_elements_by_partial_link_text('xxx')
    ###实例
    import time
    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.get('https://pythonav.com/')
    time.sleep(2)
    # driver.find_element_by_link_text('免费视').click()
    driver.find_element_by_partial_link_text('免费视').click()
    

    name定位

    # 根据name定位
    driver.find_element_by_name('xx')
    driver.find_elements_by_name('xx')
    ###实例
    import time
    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.get('https://pythonav.com/login/')
    driver.find_element_by_name('code').send_keys('xxxx')
    time.sleep(3)
    driver.quit()
    

    注意及实例

    ​ 在选择器的选用时,要记得获取一个还是多个,要区分开find_elements还是find_element。这个s容易忽略。另外,上面的选择器,都可以写成下面的形式:

    from selenium.webdriver.common.by import By  # 选择器,以什么方式选择标签元素
    browser.find_element(by=By.ID, value=None)  # 选择器类型, value值
    

    ​ 当获取了标签对象后,我们可以获取这个标签的属性、内容、css样式和子标签(子标签也支持这些操作),示例来自pythonav登录页

    import time
    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.get('https://pythonav.com/login/')
    # 根据 class 属性获取 a 标签对象
    a_obj = driver.find_element_by_class_name('navbar-brand')
    
    # 获取 a 标签的href属性
    print(a_obj.get_attribute('href'))
    print(a_obj.text)  # 获取标签的文本内容
    print(a_obj.tag_name)   # 获取标签的名称
    
    # 获取 css 样式
    print(a_obj.value_of_css_property('padding'))
    print(a_obj.value_of_css_property('font-size'))
    # 如果这个标签有 submit 属性,那么就可以点击它了,比如我们点击form表单中有submit属性的标签
    driver.find_element_by_xpath('//*[@id="fm"]/div[5]/div/input').submit()
    
    # 获取该标签下的子标签,或者子标签元素
    div_obj = driver.find_element_by_class_name('col-xs-3')
    print(div_obj.find_element_by_tag_name('input'))
    print(div_obj.find_element_by_tag_name('input').get_attribute('value'))
    
    # 获取验证码图片的大小
    print(driver.find_element_by_id('image_code').size)
    # # 保存验证码图片
    driver.find_element_by_id('image_code').screenshot('./a.png')
    

    EC

    by

    与元素定位中的结果一样,也是元素定位的另一种方法

    实例

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    driver = webdriver.Firefox()
    driver.get('https://www.baidu.com/')
    # driver.find_element_by_id('su')
    driver.find_element(By.ID, 'kw').send_keys('抠脚')   #找到id为kw的标签并写入值
    
    # By.ID
    # By.CLASS_NAME
    # By.LINK_TEXT
    # By.NAME
    # By.XPATH
    # By.CSS_SELECTOR
    

    键盘模拟

    import time
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    driver = webdriver.Chrome()
    driver.get('https://pythonav.com/login/')
    # 用户名输入值
    user = driver.find_element_by_id('id_username')
    user.send_keys('alexdsb')
    time.sleep(1)
    user.send_keys(Keys.CONTROL, 'a')   #模拟键盘Ctrl-a  全选
    #user.send_keys(Keys.DELETE)      #删除
    #user.send_keys(Keys.BACKSPACE)   #退格删除
    user.send_keys(Keys.CONTROL, 'c')   #模拟键盘Ctrl-c  复制
    #密码输入
    pwd = driver.find_element_by_id('id_password')
    pwd.send_keys(Keys.CONTROL, 'v')     #模拟键盘Ctrl-v  粘贴
    time.sleep(3)
    pwd.send_keys(Keys.TAB, 'ABC')       #TAB之后,输入值
    pwd.send_keys(Keys.ENTER)  # tab之后,直接回车
    
    time.sleep(10)
    driver.quit()
    

    鼠标模拟

    方法

    WebDriver中,关于鼠标相关操作的方法都封装在ActionChains类中

    Method Description
    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) 鼠标左键单击不松开,移动到指定坐标后松开
    move_by_offset(xoffset, yoffset) 鼠标移动到某个坐标
    move_to_element(to_element) 鼠标移动到某个元素
    move_to_element_with_offset(to_element, xoffset, yoffset) 鼠标移动到距离某个元素的某个距离
    pause(seconds) 暂停输入
    release(on_element=None) 在某个元素松开鼠标左键
    send_keys(*keys_to_send) 在当前元素中输入值
    send_keys_to_element(element, *keys_to_send) 给某个元素输入值
    perform() 相应存储的动作
    reset_actions() 清除所有已存储的动作

    单击|双击|右击

    from time import sleep
    from selenium import webdriver
    from selenium.webdriver import ActionChains
    driver = webdriver.Chrome()
    try:
        driver.get('http://sahitest.com/demo/clicks.htm')
        # 单击
        sleep(2)
        btn1 = driver.find_element_by_xpath('/html/body/form/input[3]')
        ActionChains(driver).click(btn1).perform()
        # 左键双击
        sleep(2)
        btn2 = driver.find_element_by_xpath('/html/body/form/input[2]')
        ActionChains(driver).double_click(btn2).perform()
        # 鼠标右键单击
        sleep(2)
        btn3 = driver.find_element_by_xpath('/html/body/form/input[4]')
        ActionChains(driver).context_click(btn3).perform()
    finally:
        sleep(5)
        driver.quit()
    

    拖拽

    实例1
    import time
    from selenium import webdriver
    from selenium.webdriver import ActionChains
    
    driver = webdriver.Chrome()
    driver.get('https://jqueryui.com/droppable/')
    time.sleep(3)
    # 因为该页面中,有iframe标签,所以先切换
    frame = driver.find_element_by_tag_name('iframe')
    driver.switch_to.frame(frame)
    # 获取第一个元素
    div1 = driver.find_element_by_id('draggable')
    # 获取第二个元素
    div2 = driver.find_element_by_id('droppable')
    # 拖拽
    ActionChains(driver).drag_and_drop(div1, div2).perform()
    time.sleep(5)
    driver.quit()
    
    实例2
    import time
    from selenium import webdriver
    from selenium.webdriver.common.action_chains import ActionChains
    browser = webdriver.Chrome()  # 获取webdriver实例
    browser.get('http://www.jq22.com/demo/pintu20151229/')  # 访问URL
    time.sleep(1)
    # 点击开始按钮,开始游戏
    start = browser.find_element_by_id('start')
    ActionChains(browser).move_to_element(start).click().perform()
    # 准备拖动,首先要找到开始和结束的两个标签
    time.sleep(2)
    img1 = browser.find_element_by_xpath('//*[@id="container"]/div[18]')  # 选中开始标签
    img2 = browser.find_element_by_xpath('//*[@id="container"]/div[18]')  # 结束标签
    ActionChains(browser).move_to_element(img1).drag_and_drop(img1, img2).perform()
    # 关闭浏览器
    time.sleep(3)
    browser.quit()
    

    上传文件

    import time
    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.get(url='http://127.0.0.1:8000/import_case/1')  #访问url
    time.sleep(2)
    obj = driver.find_element_by_css_selector('input[name="excel"]')  #找到input框
    file_path = r'C:UsersAdministratorDesktop接口测试示例.xlsx'
    obj.send_keys(file_path)   #输入文件路径
    time.sleep(5)
    driver.find_element_by_css_selector('.btn-success').click()   #点击上次按钮
    time.sleep(10)
    driver.quit()
    

    窗口切换

    import time
    from selenium import webdriver
    driver = webdriver.Chrome()
    #driver.switch_to.window()   # 切换到指定的窗口对象中
    #driver.switch_to.frame()   # 切换到指定的iframe
    #driver.switch_to.alert()  # 切换到alert
    #driver.switch_to.default_content()  # 切换到之前的页面中
    #driver.switch_to.parent_frame()  # 切换到它爹的iframe
    driver.get(url='https://www.baidu.com')
    driver.find_element_by_id('kw').send_keys('Na_years')   #搜索框输入Na_years
    time.sleep(1)
    driver.find_element_by_id('su').click()   #点击百度
    time.sleep(2)
    driver.find_element_by_link_text('Na_years - 博客园').click()   #点击搜索出来的选项
    time.sleep(2)
    handles = driver.window_handles    #获取到所有窗口
    time.sleep(2)
    driver.switch_to.window(handles[0])   #切换到第一个窗口
    time.sleep(2)
    driver.switch_to.window(handles[1])   #切换到第二个窗口
    time.sleep(3)
    driver.quit()
    

  • 相关阅读:
    update语句
    java List和数组相互转换方法
    mysql查最大字符串
    Mybatis各种模糊查询
    mysql 递归查询父节点 和子节点
    String类型根据逗号分隔转为list
    This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de 错误解决办法
    java中String数组和List的互相转化
    实现List集合中数据逆序排列
    String字符串去掉双引号
  • 原文地址:https://www.cnblogs.com/Nayears/p/12177690.html
Copyright © 2020-2023  润新知