• selenium 常用操作


    官方文档:

    https://selenium-python.readthedocs.io/api.html#selenium.webdriver.remote.webdriver.WebDriver.switch_to_frame

    通常初始步骤  导入 webdriver, 通过下载的chromedriver打开浏览器

    from selenium import webdriver

    bs = webdriver.Chrome('C:Program Files (x86)GoogleChromeApplicationchromedriver')

    打开网址

    bs.get('https://baidu.com')

    更改cookies              

    d_cookies=bs.get_cookies()                                                                                                                   #获取当前cookies
    bs.delete_all_cookies()                                                                                                                          #删除所有cookies然后再把登陆后的cookies放进去
    wy_cookies=[{'path': '/', 'secure': False, 'domain': '.163.com', 'httpOnly': False, 'value': 'b8df58865bd86ee3f8b458e53c950e10', 'expiry': 2166070058.40818, 'name': '_ntes_nuid'}, {'path': '/', 'secure': False, 'domain': '.163.com', 'httpOnly': False, 'value': 'ezq0pFuDlR2oYBobCwYaAg==', 'expiry': 1566886046.242035, 'name': 'usertrack'},..., {'path': '/', 'secure': False, 'domain': '.163.com', 'httpOnly': False, 'value': 'tian_kong_hen_mei@163.com|1535423998|0|blog|00&99|US&1535350140&blog#hub&420100#10#0#0|&0|blog|tian_kong_hen_mei@163.com', 'expiry': 1566960000.336024, 'name': 'P_INFO'}]

    for cok in wy_cookies:                                                                                                                              #加入目标cookies
        bs.add_cookie(cok)
    bs.refresh()                                                                                                                                              #刷新页面

    查找元素

    selenium.webdriver.common.by.By 

    CLASS_NAME='class name'元素class属性值     CSS_SELECTOR='css selector' css选择器        ID='id'元素id属性值       LINK_TEXT='link text'元素文本值    

    NAME='name'元素name属性值     PARTIAL_LINK_TEXT='partial link text' 元素部分文本值    TAG_NAME='tag name'元素标签值,如ul         XPATH='xpath'  xpath定位符

    bs.find_element(By.XPATH,'//button[text()="Some text"]')

    txt_list=bs.find_elements_by_css_selector('[class="nbw-bitm clearfix bdwb bds2 bdc0"]')                           # 通过css_selector查找
    title=txt_list[0].find_element_by_xpath('.//h3[@class="btag title thide"]/a')                                               #在已查找的元素上通多xpath的相对路径查找
    login_check=bs.find_element_by_id('input_captcha')

    img_path=check_img.get_attribute("src")                                                                                              #获取元素的属性scr值

    login_name.clear()                                                                                                                                   #对于input元素,清空

    login_name.send_keys('sometext')                                                                                                          #对元素   输入 键值 

    login_key.click()                                                                                                                                       #对元素点击

    cont.text                                                                                                                                                  #返回元素中的所有文本

    cont_iframe=bs.find_element_by_id('Editor_Edit_EditorBody_ifr')                                                      #定位 html页中的iframe元素
    bs.switch_to_frame(cont_iframe)                                                                                                            #转到指定元素的iframe里,可查找里面的元素

    bs.switch_to_frame("frameName")  通过frameName转到该frame,也可以通过 索引 转到该frame的子frame,用.号连接 ,bs.switch_to_frame("frameName.0.child")转到名字为frameName的frame中的第一个名字为child的子frame

    bs.switch_to_default_content()                                                                                                                #转到默认的页面,可用于退出iframe

    alert=driver.switch_to_alert()                                                                                                                  #转到当前打开的弹窗元素

    bs.forward()                                                                                                                                             浏览器向前一个页面

    bs.back()                                                                                                                                                    浏览器后退一个页面

    bs.save_screenshot(file)                                                                                                                           #将浏览器截屏图保存到file

    left = img.location['x']
    top = img.location['y']                                                                                                                                                                      #获取元素的坐标,即元素的左上顶点的坐标

    imgWidth = left + img.size['width']
    imgHeight = top + img.size['height']                                                                                                                                                #获取元素的右下顶点的坐标

    填表单

    from selenium.webdriver.support.ui import Select

    select=Select(driver.find_element_by_name('name'))                                                                              选框元素

    select.select_by_index(index)                                                                                                                   选择对应索引项

    select.select_by_visible_text("text")                                                                                                       选择对应 文本 项

    select.select_by_value(value)                                                                                                                    选择value属性值 对应的项

    select.deselect_all()                                                                                                                                  将select中所有已选中的项 取消选择

    all_selected_options=select.all_selected_options                                                                                     返回 所有已被选择的项的列表

    options=select.options                                                                                                                               返回 所有选项 的列表

    等待,直到元素出现   selenium.webdriver.support.wait.WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceprions=None)

    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait

    WebDriverWait(browser, 50).until(EC.presence_of_element_located((By.ID, 'LoginForm_username')))                 明确的等待50秒,而不抛出异常,直到指定元素出现

    driver  :  WebDriver 实例 (IE,Firefox,Chrome or Remote)

    timeout : 超时的秒数

    poll_frequency : 查找元素的间隔秒数,默认为0.5秒

    ignored_exceptions : 当该方法被调用时被忽略的异常类,默认只包含 NoSuchElementException 

    until(method,message='')   :调用这个driver有的某个方法,直到该方法的返回值不为 False

    until_not(method,message='') :直到该方法的返回值为 Flase

    例 :element=WebDriverWait(driver,10).until(lambda x:x.find_element_by_id("someId"))

    is_disappeared=WebDriverWait(driver,30,1,(ElementNotVisibleException)).until_not(lambda x:x.find_element_by_id("someId").is_displayed())

    ecpected conditions拥有的方法

    title_is  ,title_contains  ,presence_of_element_located     ,  visibility_of_element_located , visibility_of   ,presence_of_all_elements_located   ,text_to_be_present_in_element  , 

    text_to_be_present_in_element_value ,frame_to_be_available_and_switch_to_it ,invisibility_of_element_located ,element_to_be_clickable ,staleness_of ,element_to_be_selected ,

    element_located_selection_state_to_be , alert_is_present 

     

    模糊的等待 Implicit Waits  用于设置当webdriver  试图查找元素时的等待时间,这个元素并不是立即可用。默认设置的隐式等待时间是0,一旦设置,将作用于WebDriver对象的整个生命周期

    driver = webdriver.Firefox()
    driver.implicitly_wait(10) # seconds
    driver.get("http://somedomain/url_that_delays_loading")
    myDynamicElement = driver.find_element_by_id("myDynamicElement")

    执行js脚本

     js='window.open("https://i.cnblogs.com/EditPosts.aspx?opt=1")'                                                                      #在新标签页中打开网址

    bs.execute_script(js)

    浏览器已打开的标签页的  句柄

    bs.window_handles                                                                                                                                             #返回所有标签页的句柄列表

    bs.switch_to_window(bs.window_handles[0])                                                                                                      #将窗口切换到句柄列表中的第一个标签页

    bs.close()                                                                                                                                                             #关闭当前标签页           

    bs.current_url                                                                                                                                                    #返回当前窗口的url 

    browser.set_window_size(1720, 800)                                                                                                                 #设置浏览器窗口大小

    基本异常类型

    selenium.common.exceptions.WebDriverException

    动作链 ActionChains             用于自动按顺序执行一系列的动作,一般用于鼠标移动,点击,键盘输入 

    from selenium.webdriver.common.action_chains import ActionChains 

    sliper=check_line.find_element_by_xpath('./div/img')

    news=driver.find_element_by_css_selector("a[title='新浪新闻']")

    action=ActionChains(bs).move_to_element(sliper).click(news)      

    action.perform()

    也可写作 actions=ActionChains(bs)          actions.move_to_element(sliper)            actions.click(news)     actions.perform()

    动作会存储在一个队列中,当调用perform()时,动作被按顺序执行,队列被清空

    ActionChains对象的方法

    click(on_element=None)                                                                                                                              点击 ,如果入参为None,则在当前位置点击

    click_and_hold(on_element=None)                                                                                                             在某元素上  按下鼠标左键,不松   

    context_click(on_element=None)                                                                                                              选中某元素,鼠标右键    

    double_click(on_element=None)                                                                                                                在某元素上双击

    drag_and_drop(source,target)                                                                                                                  在source元素上按下鼠标左键,拖到元素target处释放

    drag_and_drop_by_offset(source,xoffset,yoffset)                                                                                 把元素source拖到相对位置(xoffset,yoffset)

    key_down(value,element=None)                                                                                                                 在某元素上,按住某个键(仅用于调整键 Ctrl ,Alt,Shift)

    ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()          执行ctrl+c

    key_up(value,element=None)                                                                                                                     在某元素上,释放某个键(仅用于调整键 Ctrl ,Alt,Shift)

    move_by_offset(xoffset,yosffset)                                                                                                           让鼠标移动相对位移(xoffset,yoffset)

    move_to_element(to_elemnt)                                                                                                                    把鼠标移动到元素中心

    move_to_element_with_offset(to_element,xoffset,yoffset)                                                                      通过一个相对位移,将鼠标移动到元素to_element , 坐标原点为左上顶点

    pause(seconds)                                                                                                                                           暂停所有输入    在特定的秒数期间

    perform()                                                                                                                                                   执行所有存储的动作

    release(on_element=None)                                                                                                                        在某元素上释放一个鼠标按键

    reset_actions()                                                                                                                                          清除已存储的动作

    send_keys(*keys_to_send)                                                                                                                         在当前聚焦的元素上 输入按键

    send_keys_to_element(lelement,*keys_to_send)                                                                                      向某个元素输入按键

     键值

    Special Keys                                                                                                                                            键盘 ,键值

    from selenium.webdriver.common.keys import Keys

    elem.send_keys(Keys.RETURN)

    elem.clear()                                                                                                                                              输入内容前不会自动清空,可用clear()清空input中 已有内容

    element.send_keys(" and some", Keys.ARROW_DOWN)                                                  输入 " and some ",然后按下 向下键

     Chrome WebDriver

    class

    selenium.webdriver.chrome.webdriver.WebDriver(executable_path='chromedriver',port=0,options=None,service_args=None,desired_capabilities=None,service_log_path=None,chrome_options=None)

    Base:selenium.webdriver.remote.webdriver.WebDriver                                            ,chromedriver下载地址:http://chromedriver.storage.googleapis.com/index.html

     executable_path : 下载的chromedriver的路径

    port : 该服务运行的端口号,默认0表示自动选择一个可用的端口号

    desired_capabilities:dict类型,用于无头浏览器特定存储容器,例存储proxy,loggingPref等

    options:接收ChromeOptions实例

    具有的方法:

    create_options()

    get_network_conditions()  获取chrome 网络竞争设置,返回一个dict,例如{‘latency':4,’download_throughput':2,'upload_throughput':2,'offline':False}

    launch_app(id)   通过chrome应用的id启动chrome应用

    quit() 关闭浏览器并停止chromedirver

    set_network_conditions(**network_conditions) 设置chrome网络竞争设置 ,network_conditions:dict类型,

    例如 driver.set_network_conditions(offline=False,latency=5, #额外的延迟(毫秒)

                     download_throughput=500*1024,#最大吞吐量

                     upload_throughput=500*1024)#最大吞吐量

    ‘throughput’可以同时设置上传和下载的吞吐量

    无头浏览器phantomjs设置请求头 

    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

    exe_path = 'E:\Codeayspider\bin\phantomjs.exe'

    dcap = dict(DesiredCapabilities.PHANTOMJS)
    dcap['phantomjs.page.settings.userAgent'] = (
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0'
    )
    headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0'
    }
    for key, value in headers.items():
       dcap['phantomjs.page.customHeaders.{}'.format(key)] = value

    proxy = webdriver.Proxy()
    proxy.proxy_type = ProxyType.MANUAL
    proxy.http_proxy = proxy_ip
    proxy.add_to_capabilities(dcap)

    browser = webdriver.PhantomJS(executable_path=exe_path,desired_capabilities=dcap)
    browser.set_window_size(1720, 800) # 这里是关键,对于无头浏览器,必须窗口设置,否则报错
    browser.get(url)

    Remote WebDriver 

    class selenium.webdriver.remote.webdriver.WebDriver(command_executor='http://127.0.0.1:4444/wd/hub',desired_capabilities=None,browser_profile=None,proxy=None,keep_alive=False,file_detector=None,options=None)

    属性: session_id .: 浏览器会话的 字符串id , 被这个webdriver控制的会话

    capabilities : 这个浏览器会话返回的 字典形式的 有效容器,右这个remote server返回,详见 https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities

    command_executor .  :用于执行指令 remote_connection.RemoteConnection 对象

    error_handler . :  errorhandler.ErrorHandler 对象 ,用于处理异常

    desired_capabilities: 浏览器会话 发送请求时附加信息的dict形式容器

    browser_profile   : 一个 selenium.webdriver.firefox.firefox_profile.FirefoxProfile 对象 ,仅用于火狐浏览器需要时

    proxy :  selenium.webdriver.common.proxy.Proxy  对象 ,浏览器会话会通过设定的 代理 进行请求

    file_detector  :  实例化过程的文件探测器,为None则启用默认的 LocalFileDetector()

     方法:

    add_cookie(cookie_dict) ,cookie_dict:dict类型,必要key ,"name","value";可选key:"path","domain",secure","expiry"   

    使用方式例 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})

     back() 浏览器历史记录后退一步

    close() 关闭当前窗口

    create_web_element(element_id) 用元素id创建web元素

    delete_all_cookies()删除session种的所有cookie ,driver.delete_all_cookies()

    delete_cookie(name) ,根据name删除指定cookie

    execute(driver_command,params=None)在浏览器控制台执行的指令,driver_command:string, params:dict ,返回response的dict形式

    execute_async_script(script,*args) 在当前窗口异步执行javascript。 script:执行的javascript脚本,args:script种需要的参数,

    例:script = “var callback = arguments[arguments.length - 1]; ” “window.setTimeout(function(){ callback(‘timeout’) }, 3000);”                driver.execute_async_script(script)

    execute_script(script,*args)  在当前窗口同步的执行javascript

    file_detector_context(*args,**kwds):如果需要重置当前限制的环境下的文件探测器,确保原始的文件探测器被设置在其后

    find_element(by='id',value=None)

    forward() :在浏览器历史中向前一步

    fullscreen_window()  :使用窗口的”最大化“操作

    get(url):在当前的浏览器会话中加载页面

    get_cookie(name) :根据name获取cookie值

    get_cookies() :返回当前会话中可见的cookies ,dict形式

    get_log(log_type):返回给定类型的log ,例 driver.get_log(‘browser’)     driver.get_log(‘driver’)        driver.get_log(‘client’)           driver.get_log(‘server’)

    get_screenshot_as_base64() :返回当前屏幕截图的base64编码字符 

    get_screenshot_as_file(filename) :将当前屏幕截图保存到全路径filename

    get_screenshot_as_png() :返回当前屏幕截图的二进制数值

    get_window_position(windowHandle='current') 返回当前窗口的位置(x,y)

    get_window_rect() :返回当前窗口的坐标(x,y)和当前 ‘高’,‘宽’ 值

    get_window_size(windwoHandle='current') :返回当前窗口的 宽,高 

    implicitly_wait(time_to_wait) 

    maximize_window():最大化当前窗口

    minimize_window():调用窗口的 ‘最小化’ 操作

    refresh()

    save_screenshot(filename):保存当前浏览器截图

    set_page_load_timeout(time_to_wait):设置页面加载的等待时间,超时则报错

    set_script_timeout(time_to_wait):设置异步执行脚本的等待时间,超时则报错

    set_window_position(x,y,windowHandle='current') :设置窗口的位置

    set_window_rect(x=None,y=None,width=None,height=None) :设置窗口的位置和高宽    例,driver.set_window_rect(x=10, y=10)    driver.set_window_rect(width=100, height=200)    driver.set_window_rect(x=10, y=10, width=100, height=200)

    set_window_size(width,height,windowHandle='current') :设置窗口的宽,高

    start_client() :在开启新会话前调用,可以通过覆写该方法来定义个性化的 开启行为

    start_session(capabilities,browser_profile=None):用目标容器capabilities 来创建一个新会话 ,参数{browser_name:请求的浏览器名称,version:请求的浏览器版本,platform:请求的浏览器所在的平台,javascript_endabled:新会话是否应该支持javascript, browser_profile :仅用于火花浏览器需要时

    stop_client() :在执行quit()后调用的方法,可以通过覆写该方法来个性化 关闭的行为

    switch_to_active_element() :等同于 driver.switch_to.active_element

    application_cache :返回ApplicationCache对象来与浏览器应用 缓存 交互

    current_url :返回当前页面的url

    current_window_handle :返回当前窗口的句柄

    desired_capabilities:返回drivers当前 被使用的 desired capabilities 

    file_detector 

    log_types :返回可用的log 类型列表

    mobile

    name:返回当前浏览器实例driver的name 

    orientation :获取当前设备的 环境状态

    page_source : 获取当前页的资源

    switch_to : 例如  element = driver.switch_to.active_element                alert = driver.switch_to.alert              driver.switch_to.default_content()            driver.switch_to.frame(‘frame_name’)         

    driver.switch_to.frame(1)       driver.switch_to.frame(driver.find_elements_by_tag_name(“iframe”)[0])          driver.switch_to.parent_frame()              driver.switch_to.window(‘main’)

    title :返回当前页的标题

    window_handles : 返回当前会话的所有 窗口 handles 列表

    预期状态 

    Expected conditions Support

    class 

    selenium.webdriver.support.expected_conditions.alert_is_present     预期有一个alert被展示

  • 相关阅读:
    关于[x/y]一些小想法
    mycat主从读写分离范例
    EOJ 262 润清的烦恼
    mycat server.xml 配置文件详解
    Mongodb in Mycat指南
    牛客网NOIP赛前集训营-普及组(第一场)
    MyCAT分表初体验
    牛客网NOIP赛前集训营-提高组(第一场)
    日期类型的特殊性 -- 日期函数转换
    POJ 1966 Cable TV Network 【经典最小割问题】
  • 原文地址:https://www.cnblogs.com/Ting-light/p/9770908.html
Copyright © 2020-2023  润新知