zoukankan      html  css  js  c++  java
  • 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()
    

  • 相关阅读:
    hdu 5723 Abandoned country 最小生成树 期望
    OpenJ_POJ C16G Challenge Your Template 迪杰斯特拉
    OpenJ_POJ C16D Extracurricular Sports 打表找规律
    OpenJ_POJ C16B Robot Game 打表找规律
    CCCC 成都信息工程大学游记
    UVALive 6893 The Big Painting hash
    UVALive 6889 City Park 并查集
    UVALive 6888 Ricochet Robots bfs
    UVALive 6886 Golf Bot FFT
    UVALive 6885 Flowery Trails 最短路
  • 原文地址:https://www.cnblogs.com/Nayears/p/12177690.html
Copyright © 2011-2022 走看看