美文网首页
selenium常用API使用总结

selenium常用API使用总结

作者: 是立品啊 | 来源:发表于2021-01-18 21:16 被阅读0次

    安装

    1. 安装依赖包 pip install selenium
    2. selenium是配合浏览器一起使用,所以需要下载浏览器对应版本的驱动文件webdriver
    3. 检测安装是否成功
    # 普通启动
    
    from selenium import webdriver
    
    # 1. 实例化一个浏览器
    browser = webdriver.Chrome("./chromedriver")  # 参数为驱动路径
    
    browser.get("http://www.baidu.com/")  # 驱动浏览器访问百度
    
    browser.page_source  # 获取当前浏览器的html
    
    browser.quit()  # 退出实例化的浏览器
    

    元素定位方式

    • 单元素提取-返回元素对象
    browser.find_element_by_id("id")  # 通过id定位
    browser.find_element_by_name("name")  # 通过name定位
    browser.find_element_by_link_text("link")  # 通过链接文本定位
    browser.find_element_by_partial_link_text("link")  # 通过链接文本定位
    browser.find_element_by_class_name("class_name")  # 通过classname定位
    browser.find_element_by_tag_name("input")  # 通过tag标签定位
    browser.find_element_by_xpath("//input[@id='kw']")  # 通过xpath定位
    browser.find_element_by_css_selector("#kw")  # 通过CSS方式定位
    

    注意:如果是多元素提取-返回包含多元素对象的列表,可以通过数组index取出对应的元素对象

    元素对象操作方法

    browser.find_element_by_name("name").click()  # 点击对象
    browser.find_element_by_name("name").send_keys("keyword")  # 模拟键盘输入
    browser.find_element_by_name("name").clear()  # 清除对象的内容
    browser.find_element_by_name("name").submit()  # 提交对象的内容
    browser.find_element_by_name("name").text()  # 获取元素的文本信息
    browser.find_element_by_name("name").context_click()  # 右键单击
    browser.find_element_by_name("name").double_click()  # 双击
    browser.find_element_by_name("name").is_displayed()  # 是否用户可见
    

    页面对象的操作方法

    browser.maximize_window()  # 浏览器最大化
    browser.minimize_window()  # 浏览器最小化
    browser.set_window_size(480, 800)  # 自定义浏览器窗口大小
    browser.forword()  # 浏览器前进
    browser.back()  # 浏览器后退
    browser.close()  # 关闭浏览器当前窗口
    browser.quit()  # 退出浏览器驱动并关闭所有窗口
    browser.refresh()  # 刷新当前页
    browser.page_source  # 获取当前页html
    browser.title  # 获取当前页标题
    browser.url  # 获取当前页url
    

    ifame

    browser.switch_to_frame("f1")  # 找到 f1 iframe
    browser.switch_to_window("f1")  # 找到内嵌窗口 f1
    driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])
    

    多窗口切换

    driver.get("http://example.com")  # 打开一个窗口
    now_handle = drvier.current_window_handle  # 获取当前窗口句柄
    
    driver.find_element_by_name('example').click()  # 点击某个元素打开新的窗口(target="_black"的元素)
    all_handle = drvier.window_handles  # 获取所有窗口句柄
    drvier.switch_to.window(now_handle)  # 切换为第一窗口
    driver.close()  # 关闭当前窗口
    

    通过input上传附件

    self.browser.find_element_by_xpath('//input[@class="file-selector-file"]').send_keys("/Users/mac/Documents/myspider/selenium_spider/test.mp4")  # 必须要用绝对路径
    

    操作cookies

    browser.get_cookie("name")  # 根据name获取单个cookie
    browser.get_cookies()  # 获取所有cookie
    browser.delete_all_cookies()  # 删除所有cookies
    browser.delete_cookie("name")  # 根据name删除对应cookie
    browser.add_cookie({"k1": "v1", "k2": "v2"})  # 设置cookies
    

    获取截屏

    browser.get_screenshot_as_file("/usr/download/down_image.png")  # 保存当前窗口截图
    browser.get_screenshot_as_png()  # 获取当前png截图的二进制字符串
    

    等待方式

    • 强制等待
    time.sleep(10) # 强制程序休眠10s
    
    • 隐式等待

      全局设置一个隐式等待时间,等待对象为整个页面,判断依据是:在规定时长内加载完整个页面的所有元素。等待对象是:页面所有元素

    driver.implicitly_wait(10) # seconds,隐式等待,参数为最长等待时间(s)。页面全部加载完成才会执行下一步操作
    
    • 显式等待

      显式等待指定某个条件,然后设置最长等待时间。如果在这个时间内指定的元素元素达到指定条件,就继续执行。等待对象是:指定元素

      from selenium import webdriver
      from selenium.webdriver.support.ui import WebDriverWait
      driver = webdriver.Chrome()
      driver.get("http://somedomain/url_that_delays_loading")
      try:
          element = WebDriverWait(driver, 10).until(
              EC.presence_of_element_located((By.ID, "myDynamicElement"))
          )
      finally:
          driver.quit()
    

    wait模块的WebDriverWait类是显性等待类,参数如下:

    WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)
    

    这里需要特别注意的是untiluntil_not中的可执行方法method参数,很多人传入了WebElement对象,如下:

    WebDriverWait(driver, 10).until(driver.find_element_by_id('kw'))  # 错误
    

    这是错误的用法,这里的参数一定要是可以调用的,即这个对象一定有 call()方法,否则会抛出异常:TypeError: 'xxx' object is not callable, 在这里,你可以用selenium提供的expected_conditions模块中的各种条件,也可以用WebElementis_displayed()is_enabled()is_selected()方法,或者用自己封装的方法都可以。

    WebDriverWait(browser, 30).until(EC.title_is("百度一下,你就知道"))  # 等待,直到标题是百度一下,或超时
    WebDriverWait(browser, 30).until(EC.title_contains("百度"))  # 等待,直到标题包含百度,或超时
    WebDriverWait(browser, 30).until(EC.presence_of_element_located((By.ID, "id")))  # 等待,直到Dom中存在该id
    WebDriverWait(browser, 30).until(EC.visibility_of_element_located((By.ID, "id")))  # 等待,直到Dom中存在该id并且可见
    WebDriverWait(browser, 30).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='u1']/a[8]")))  # 等待,直到该元素是可点击的
    WebDriverWait(browser, 30).until(EC.text_to_be_present_in_element_value((By.CSS_SELECTOR,'.main'),'enable'))  # 判断.main中是否包含enable字符串,返回布尔值
    WebDriverWait(browser, 30).until(EC.staleness_of(driver.find_element(By.ID,'id')))  # 等待,直到id从dom中移除
    

    expected_conditions模块

    expected_conditionsselenium的一个模块,其中包含一系列可用于判断的条件,所有17个condition,与untiluntil_not组合能够实现很多判断,如果能自己灵活封装,将会大大提高脚本的稳定性。

    selenium.webdriver.support.expected_conditions(模块)
    
    这两个条件类验证title,验证传入的参数title是否等于或包含于driver.title
    title_is
    title_contains
    
    这两个人条件验证元素是否出现,传入的参数都是元组类型的locator,如(By.ID, 'kw')
    顾名思义,一个只要一个符合条件的元素加载出来就通过;另一个必须所有符合条件的元素都加载出来才行
    presence_of_element_located
    presence_of_all_elements_located
    
    这三个条件验证元素是否可见,前两个传入参数是元组类型的locator,第三个传入WebElement
    第一个和第三个其实质是一样的
    visibility_of_element_located
    invisibility_of_element_located
    visibility_of
    
    这两个人条件判断某段文本是否出现在某元素中,一个判断元素的text,一个判断元素的value
    text_to_be_present_in_element
    text_to_be_present_in_element_value
    
    这个条件判断frame是否可切入,可传入locator元组或者直接传入定位方式:id、name、index或WebElement
    frame_to_be_available_and_switch_to_it
    
    这个条件判断是否有alert出现
    alert_is_present
    
    这个条件判断元素是否可点击,传入locator
    element_to_be_clickable
    
    这四个条件判断元素是否被选中,第一个条件传入WebElement对象,第二个传入locator元组
    第三个传入WebElement对象以及状态,相等返回True,否则返回False
    第四个传入locator以及状态,相等返回True,否则返回False
    element_to_be_selected
    element_located_to_be_selected
    element_selection_state_to_be
    element_located_selection_state_to_be
    
    最后一个条件判断一个元素是否仍在DOM中,传入WebElement对象,可以判断页面是否刷新了
    staleness_of
    

    鼠标操作

    鼠标操作包含在ActionChains类中,操作方法如下:

    • context_click(elem) 右击鼠标点击元素elem,另存为等行为
    • double_click(elem) 双击鼠标点击元素elem,地图web可实现放大功能
    • drag_and_drop(source,target)拖动鼠标,源元素按下左键移动至目标元素释放
    • move_to_element(elem) 鼠标移动到一个元素上
    • click_and_hold(elem) 按下鼠标左键在一个元素上
    • perform() 在通过调用该函数执行ActionChains存储行为

    鼠标操作示例代码

    from selenium.webdriver.common.action_chains import ActionChains
    
    el = driver.find_element_by_name('tj_trnews')  # 目标元素
    
    ActionChains(driver).context_click(el).perform()  # 右击目标元素
    ActionChains(driver).double_click(el).perform()  # 双击目标元素
    
    source = driver.find_element_by_id('lg')   # 目标元素原始位置
    target = driver.find_element_by_id('kw')  # 拖动的目标位置
    ActionChains(driver).drag_and_drop(source, target).perform()  # 拖动元素
    
    ActionChains(driver).move_to_element(el).perform()  # 鼠标移动的目标元素上
    ActionChains(driver).click_and_hold(el).perform()  # 移动到目标元素按下鼠标左键
    

    键盘操作

    webdriverKeys类中提供了键盘所有的按键操作,当然也包括一些常见的组合键操作如Ctrl+A(全选)、Ctrl+C(复制)、Ctrl+V(粘贴)。

    • send_keys(Keys.ENTER)按下回车键
    • send_keys(Keys.TAB)按下Tab制表键
    • send_keys(Keys.SPACE)按下空格键space
    • send_keys(Kyes.ESCAPE)按下回退键Esc
    • send_keys(Keys.BACK_SPACE) 按下删除键BackSpace
    • send_keys(Keys.SHIFT) 按下shift键
    • send_keys(Keys.CONTROL)按下Ctrl键
    • send_keys(Keys.ARROW_DOWN) 按下鼠标光标向下按键
    • send_keys(Keys.CONTROL,'a') 组合键全选Ctrl+A
    • send_keys(Keys.CONTROL,'c') 组合键复制Ctrl+C
    • send_keys(Keys.CONTROL,'x') 组合键剪切Ctrl+X
    • send_keys(Keys.CONTROL,'v') 组合键粘贴Ctrl+V

    键盘操作的代码示例

    import time
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
     
    driver = webdriver.Firefox()
    driver.get("http://www.baidu.com")
     
    #输入框输入内容
    elem = driver.find_element_by_id("kw")
    elem.send_keys("Eastmount CSDN")
    time.sleep(3)
     
    #删除一个字符CSDN 回退键
    elem.send_keys(Keys.BACK_SPACE)
    elem.send_keys(Keys.BACK_SPACE)
    elem.send_keys(Keys.BACK_SPACE)
    elem.send_keys(Keys.BACK_SPACE)
    time.sleep(3)
     
    #输入空格+"博客"
    elem.send_keys(Keys.SPACE)
    elem.send_keys(u"博客")
    time.sleep(3)
     
    #ctrl+a 全选输入框内容
    elem.send_keys(Keys.CONTROL,'a')
    time.sleep(3)
     
    #ctrl+x 剪切输入框内容
    elem.send_keys(Keys.CONTROL,'x')
    time.sleep(3)
     
    #输入框重新输入搜索
    elem.send_keys(Keys.CONTROL,'v')
    time.sleep(3)
     
    #通过回车键替代点击操作
    driver.find_element_by_id("su").send_keys(Keys.ENTER)
    time.sleep(3)
     
    driver.quit()
    

    其他

    获取窗口信息

    browser.get_window_rect()  # 获取当前窗口xy坐标及当前窗口的高度和宽度
    browser.get_window_position(windowHandle="current")  # 获取当前窗口的x,y坐标
    browser.get_window_size(windowHandle="current")  # 获取当前窗口的高度和宽度
    

    执行js代码

    browser.execute_async_script(script, *args)  # 在当前的window/frame中异步执行JS代码
    browser.execute_script(script, *args)  # 在当前的window/frame中同步执行JS代码
    
    script: JS代码(str)
    *args: 要传入js的参数(iterable)
    

    相关文章

      网友评论

          本文标题:selenium常用API使用总结

          本文链接:https://www.haomeiwen.com/subject/aaqfzktx.html