美文网首页
selenium 基础整理 (一)

selenium 基础整理 (一)

作者: 一如既往而已 | 来源:发表于2019-12-06 16:10 被阅读0次

    将自己之前的selenium学习记录的自抽空理整下分享给大家,也是对自己这么长时间来使用的总结吧。

    一、元素的定位操作

    以下是所有定位操作的 API :
    返回一个匹配元素, 即一个 WebElement 元素

    find_element_by_id()
    find_element_by_name()
    find_element_by_class_name()
    find_element_by_tag_name()
    find_element_by_link_text()
    find_element_by_partial_link_text()
    find_element_by_xpath()
    find_element_by_css_selector()
    

    返回一个列表, 包含所有匹配的元素, 即一个 WebElement 列表

    find_elements_by_id()
    find_elements_by_name()
    find_elements_by_class_name()
    find_elements_by_tag_name()
    find_elements_by_link_text()
    find_elements_by_partial_link_text()
    find_elements_by_xpath()
    find_elements_by_css_selector()
    

    常用定位元素使用例子

    #通过id方式定位
    browser.find_element_by_id("kw").send_keys("selenium")
    
    #通过name方式定位
    browser.find_element_by_name("wd").send_keys("selenium")
    
    #通过tag name方式定位(失败的去掉)
    browser.find_element_by_tag_name("input").send_keys("selenium")
    
    #通过class name 方式定位
    browser.find_element_by_class_name("s_ipt").send_keys("selenium")
    
    #通过CSS方式定位
    browser.find_element_by_css_selector("#kw").send_keys("selenium")
    
    #通过xphan方式定位
    browser.find_element_by_xpath("//input[@id='kw']").send_keys("selenium")
    ############################################
    browser.find_element_by_id("su").click()
    
    
    '''
    #CSS的比较灵活可以选择控件的任意属性,上面的例子中:
    find_element_by_css_selector("#kw")
    #通过find_element_by_css_selector( )函数,选择取百度输入框的id属性来定义,也可以取name属性
    <a href="http://news.baidu.com" name="tj_news">新 闻</a>
    driver.find_element_by_css_selector("a[name=\"tj_news\"]").click()
    
    '''
    

    使用的时候需注意下面几点 :
    1). python selenium 提供了两种对象 : WebDriver 和 WebElement
    这两种对象都可以使用这些 API
    2). 这些 API 一旦执行失败(即查找不到), 就会抛出异常
    因此必须使用 try: .. except: ... 机制避免错误的行为影响程序继续进行
    3). WebDriver 调用以上 API 进行全局定位
    WebElement 调用以上 API 可以进行层级定位, 即 查找当前元素的子元素

    二、WebDriver 和WebElement的使用

    2.1 WebDriver 的使用
    开始的时候必须要有初始化一个 WebDriver 实例, 即下面的 browser 用来对浏览器进行控制以及页面的访问

    #请求连接
    req_url = "http://www.haosou.com/s?ie=utf-8&shb=1&src=360sou_newhome&q=%E9%B2%9C%E8%8A%B1"
    # 打开浏览器
    browser = webdriver.Chrome()
    #开始请求
    browser.get(req_url)
    

    接着, 就可以使用异常 API 进行当前页面的全局查找, 比如 :

    #获取所有的广告
    all_ads_li = browser.find_elements_by_css_selector('#e_idea_pp li')
    

    2.2 WebElement 的使用

    1. 使用 browser.find_element_by_xx() 得到的是一个 WebElement 实例
      使用获得的实例调用上面的 API 即可进行层级查找

    2. 使用 browser.find_elements_by_xx() 得到的是一个元素是 WebElement 实例的 list
      通过对 list 的遍历, 即可对各个实例进行相应的操作

    三、webdriver和webelement的常用操作函数

    3.1 WebDriver 的一些常用操作

    3.1.1 WebDriver常用的函数

    browser.get(url) : 在当前窗口加载 url
    
    browser.refresh() : 刷新当前页面
    
    browser.close()  : 关闭当前窗口, 如果当前窗口是最后一个窗口, 浏览器将关
    
    browser.quit()  : 关闭所有窗口并停止 ChromeDriver 的执行
    
    browser.back() : 相当于浏览器的后退历史记录
    
    browser.forward() : 相当于浏览器的前进历史记录
    

    3.1.2 WebDriver 常用的属性

    browser.page_source : 当前页面的源码 (一般可以用beautifulSoup解析)
    
    browser.title : 当前页面的 title
    
    browser.name : 当前浏览器的名字
    
    browser.curren_url : 获取当前加载页面的 URL
    

    3.1.3 WebDriver 其他属性(js/cookies/window)

    JS脚本:

    browser.execute_script(script, *args) : 同步执行 js 脚本 
    
    browser.execute_async_script(script, *args) : 异步执行 js 脚本
    

    Cookies:

    browser.add_cookie(cookie_dict) : 为当前会话添加 cookie 
    
    browser.get_cookie(name) : 得到执行 cookie 
    
    browser.get_cookies() : 得到所有的 cookie
    
    driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’}) 
    driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’, ‘path’ : ‘/’}) 
    driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’, ‘path’ : ‘/’, ‘secure’:True})
    
    browser.delete_all_cookies() : 删除当前会话的所有cookie 
    
    browser.delete_cookie(name) : 删除指定 cookie
    

    Window:

    browser.current_window_handle : 当前窗口的 handle, 相当于一个指针一样的东西,用来指向当前窗口
    
    browser.window_handles : 当前浏览器中的已经打开的所有窗口, 是一个 list
    

    切换 window_handle 指向的窗口

    old: browser.switch_to_window(window_handle) 
    
    new: browser.switch_to.window(window_handle) 
    
    browser.maximize_window() # 窗口最大化
    
    browser.minimize_window() # 窗口最小化
    

    列子:同一个浏览器打开两个标签窗口后进行切换

    web_url = "http://www.baidu.com"
    
    browser = webdriver.Chrome()
    
    browser.get(web_url)
    
    window_one = browser.current_window_handle
    
    print(window_one)
    
    #新开一个窗口,通过执行js来新开一个窗口
    
    js='window.open("https://www.sogou.com");'
    
    browser.execute_script(js)
    
    window_two = browser.current_window_handle
    
    print(window_two)
    
    browser.switch_to_window(window_one) # 切换到第一个窗口(废弃)
    
    browser.switch_to.window(window_one)# 切换到第一个窗口(新方式)
    

    Frame:

    # 切换frame
    
    old: browser.switch_to_frame()
    
    new: browser.switch_to.frame()
    
    browser.switch_to_default_content() #跳回最外层iframe
    

    智能等待: 详细参考 5.2

    implicitly_wait()
    

    3.2 WebElement 的一些常用操作

    3.2.1 操作对象函数:

    WebElement.click() 点击对象
    
    WebElement.send_keys(text) 在对象上模拟按键输入
    
    WebElement.clear()  清除对象的内容,如果可以的话
    
    WebElement.submit()   提交表单
    
    WebElement.get_attribute()  获得属性值
    
    WebElement.is_displayed()  当前元素是否可见
    
    WebElement.is_enabled() 当前元素是否禁止, 比如经常会禁用一些元素的点击
    
    WebElement.is_selected() : 当前元素是否选中, 文本输入框的内容
    

    3.2.2 操作对象的属性:

    WebElement.text  获取该元素的文本
    
    WebElement.tagname  获取该元素的标签名
    
    WebElement.location   获取该元素的位置
    
    

    3.1.3.使用selenium webdriver 调用js
    调用js方法

    execute_script(script, *args)
    

    四、针对特殊元素的操作

    4.1 选择按钮

    方法一:通过查找方式

    element = browser.find_element_by_id("nr")
    
    element.find_element_by_xpath("//option[@value='50']").click()
    

    方法二:通过实例化select

    from selenium.webdriver.support.ui import Select
    
    option = Select(browser.find_element_by_name("NR"))
    
    option.select_by_index(1) # 从0开始计算,就是选择了第二个选择项
    
    option.select_by_value("50")
    
    option.select_by_visible_text("每页显示50条")
    

    4.2 selenium 对下拉框信息的定位,以及对警告提示框的处理

    • 处理下拉框
    • switch_to_alert()
    • accept()
      下拉框是我们最常见的一种页面元素,对于一般的元素,我们只需要一次就定位,但下拉框里的内容需要进行两次定位,先定位到下拉框,再定位到下拉框内里的选项。

    1)常用下拉列表框选择

    <html>
    
    <body>
    
    <select id="changeMethod" name="changeMethod">
    
    <option value="aa">AA</option>
    
    <option value="bb">BB</option>
    
    <option value="cc" selected="">CC</option>
    
    </select>
    
    </body>
    
    </html>
    

    将上面的代码保存成html通过浏览器打开会看到一个最简单常见的下拉框,下拉列表有几个选项。

    现在我们来选择下拉列表里的BB

    m=driver.find_element_by_id("ShippingMethod")
    
    m.find_element_by_xpath("//option[@value='bb']").click()
    

    2)百度搜索设置下拉框操作

    #-*-coding=utf-8
    
    from selenium import webdriver
    
    import os,time
    
    driver= webdriver.Firefox()
    
    driver.get("http://www.baidu.com")
    
    #进入搜索设置页
    
    driver.find_element_by_link_text("搜索设置").click()
    
    #设置每页搜索结果为100条
    
    m=driver.find_element_by_name("NR")
    
    m.find_element_by_xpath("//option[@value='100']").click()
    
    time.sleep(2)
    
    #保存设置的信息
    
    driver.find_element_by_xpath("//input[@value='保存设置']").click()
    
    time.sleep(2)
    
    driver.switch_to_alert().accept()
    
    #跳转到百度首页后,进行搜索表(一页应该显示100条结果)
    
    driver.find_element_by_id("kw").send_keys("selenium")
    
    driver.find_element_by_id("su").click()
    
    time.sleep(3)
    
    driver.quit()
    

    解析:
    当我们在保存百度的设置时会会弹出一个确定按钮;我们并没按照常规的方法去定位弹窗上的“确定”按钮,而是使用:

    driver.switch_to_alert().accept()
    

    完成了操作,这是因为弹窗比较是一个具有唯一性的警告信息,所以可以用这种简便的方法处理。

    – switch_to_alert()

    焦点集中到页面上的一个警告(提示)

    – accept()
    接受警告提示

    五、其他操作

    5.1 鼠标操作

    这个需要使用webdriver下的ActionChains类,这个类是操作鼠标操作的:

    from selenium.webdriver import ActionChains
    

    鼠标操作可分为三类:鼠标移动、鼠标拖拽、鼠标点击

    element = driver.find_element_by_name('tj_settingicon') #鼠标点击 
    
    ActionChains(driver).click(element).perform() #单击某元素 
    
    ActionChains(driver).click_and_hold(element).perform() #在此元素上按下左键不放 
    
    ActionChains(driver).context_click(element).perform() #在此元素上单击右键 
    
    ActionChains(driver).double_click(element).perform() #在此元素上双击 #鼠标拖拽 
    
    ActionChains(driver).drag_and_drop(source,target).perform() #从一个元素的位置,拖至另一个元素位置松开 
    
    ActionChains(driver).drag_and_drop_by_offset(source,xoffset,yoffset) #以坐标的形式拖拽,x,y  #鼠标移动 ActionChains(driver).move_by_offset(x,y) #移动到(x,y)坐标位置 
    
    ActionChains(driver).move_to_element(element) #鼠标移动到某个元素上 
    
    ActionChains(driver).move_to_element_with_offset(element,x,y) #移动到某个元素上,然后,在移动到相对坐标(x,y)上
    
    

    说明:每个方法后都跟了一个perform()很奇怪是不是,这个perform相当于submit提交。如果你的方法后边不写这个,举个例子,百度一下,你就知道ActionChains(driver).click(element) 没有preform()。如果后边没有跟这个,你可以看到,鼠标是点击了,但是没有进行搜索,所以perform相当于提交

    5.2 显示等待(WebDriverWait)和隐示等待(implicitly_wait())
    由于有些页面加载完后,某些元素还没有加载,这样就会导致异常,脚本稳定性变差
    为了解决这个问题,selenium提供了WebDriverWait以及implicitly_wait()等待

    1) WebDriverWait显示等待:
    expected_conditions类,提供预期条件判断:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as ex
    WebDriverWait(driver,5,0.5).until(ex.presence_of_element_located(driver.find_element_by_id('kw')))
    '''
    WebDriverWait(driver,timeout,poll_frequency)在单位时间内,检测元素是否存在。返回bool型
    :parameter
    driver 驱动
    timeout等待时间
    poll_frequency检测时间间隔
    -------------------------------------------------------------------
    一般WebDriverWait配合until和until_not使用
    在单位时间内,until直到返回True,until_not相返
    WebDriverWait(driver,timeout,poll_frequency).unitl(ex.presence_of_element_located((driver.find_element_by_id('kw')))
    需要使用到的包:
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as ex
    from selenium.webdriver.common.by import By
    -------------------------------------
    presence_of_element_located是判断元素是否存在
    ex下还有很多的方法供使用,例如,判断复选是否是勾选等
    *****************************************************************
    使用时需要注意事项:ex.presence_of_element_located(driver.find_element_by_id('kw'))
    这个方法,要有两个括号,因为参数只能是一个元组
    '''
    

    expected_conditions类:

    ex.element_located_selection_state_to_be((By.ID,"kw")) #元素的选中状态是否符合预期
    ex.element_selection_state_to_be(element) #与上一个用法相同,区别在于一个参数是定位,一个是定位后的元素
    ex.alert_is_present() #判断页面上,是否存在Alert弹出框
    ex.element_located_to_be_selected((By.ID,"kw")) #某个预期元素是否被选中
    ex.element_to_be_selected(element) #与上一个用法相同,区别在于一个参数是定位,一个是定位后的元素
    ex.element_to_be_clickable() #判断元素是否可见并且可以点击
    
    ex.frame_to_be_available_and_switch_to_it() #判断该表单是否,可以切换进去,可以返回True,并且Switch进去,否则返回False
    ex.invisibility_of_element_located() #判断某元素是否存在于Dom树或不可见
    ex.new_window_is_opened() #是否有窗口被打开
    ex.presence_of_all_elements_located()
    ex.presence_of_element_located() #判读元素是否存在
    ex.text_to_be_present_in_element() #判读元素中的Text是否包含了预期字符串
    ex.text_to_be_present_in_element_value#判断元素的Value是否包含了预期字符串
    ex.title_contains(title) #判读当前页面,标题是否包含预期字符串
    ex.title_is(title) #判读当前页面,标题是否为预期
    
    ex.visibility_of_all_elements_located()
    ex.visibility_of_element_located((By.ID,"kw")) #判断某元素是否可见
    ex.visibility_of(element) #与上个用法相同,区别在于参数是定位后的元素,上一个是传的定位
    ex.visibility_of_any_elements_located((By.CLASS_NAME,"a#")) #判断是否至少有一个元素在页面中可见,如果定位到就返回列表
    

    is_displayed()元素定位下有这个方法,也可以判断元素是否可见
    driver.find_element_by_id('kw').is_displayed()

    5.2.2 隐式等待:implicitly_wait()
    implicitly_wait(s)参数为秒
    通过一段时间的等待,等待页面加载完成

    driver = webdriver.Chrome()
    driver.implicitly_wait(10) 
    driver.get('https://www.baidu.com/')
    

    相关文章

      网友评论

          本文标题:selenium 基础整理 (一)

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