美文网首页关于自动化
selenium工作原理及浏览器基本操作1(元素定位、各类弹框)

selenium工作原理及浏览器基本操作1(元素定位、各类弹框)

作者: C1R2 | 来源:发表于2020-08-18 22:06 被阅读0次

    Selenium是一款浏览器自动化框架,Webdriver是其核心,同过Webdriver将自动化脚本转化为浏览器操作指令。
    一般操作逻辑为:
    -打开网页
    -定位页面元素(链接,按钮,输入框等)
    -操作页面元素(点击,输入)
    -定位并操作下一个页面元素

    Webdriver的工作原理

    Webdriver会在本地启动一套WebService服务并绑定一个动态端口,脚本运行时通过selenium将请求发送到Webdriver服务端,然后经过不同的浏览器驱动,转换为浏览器指令。

    浏览器基本操作

    - 方法
        get():打开网页
        forward():前进
        back(): 后退
        refresh(): 刷新页面
        maximize_window():最大化窗口
        set_window_size():设置窗口大小
        close(): 关闭当前页面
        quit(): 退出浏览器
    
    • 属性
      title:标题
      current_url:当前网址
      page_source:网页源代码

    页面元素定位
    8种基本定位方式:
    通过id定位: find_element_by_id()
    通过name定位: find_element_by_name()
    通过class定位: find_element_by_class_name()
    通过tag定位: find_element_by_tag_name()
    通过link定位: find_element_by_link_text()
    通过partial link定位: find_element_by_partial_link_text()
    通过xpath定位: find_element_by_xpath()
    通过css定位: find_element_by_css_selector()

    补充:用By定位元素:
    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, "")

    当元素拥有相同的id/name/class_name/tag_name等时,可以定位到所有的元素,然后按顺序取得具体某个元素,这里使用find_elements_by_***,注意对一个s

    l = browser.find_elements_by_id("u")
    for i in l:
        i.click()
    l[2].click()
    lables = browser.find_elements_by_tag_name("label")
    print(lables[2].text)
    

    分层定位(当一个元素不好定位时,可以先定位到容易定位的父级/祖先级元素,然后使用父级/祖先级元素继续定位,如:)

    fardiv = browser.find_element_by_class_name("fathdiv")  # 先定位到父级元素
    labels = fardiv.find_elements_by_tag_name("label")  # 使用父级元素向下定位
    print(labels[2].text)
    
    

    页面元素操作
    link 链接
    click()
    input 输入框
    send_keys(): 输入
    clear(): 清空输入框
    get_attribute("value"): 获取输入框的值
    button 按钮
    click():
    isEnabled(): 是否可用
    submit():type=submit的按钮可以使用submit()同click()用于提交表单
    radio/checkbox 单选/复选框
    click(): 定位到选框可直接点击
    is_displayed(): 是否展示
    is_selected(): 是否选中状态
    select 下拉框(需要用Select)
    select_by_index(): 按索引选择选项
    select_by_value(): 按value值选择选项
    select_by_visiable_text(): 按选项名选择选项

    area = Select(browser.find_element_by_id("areaID"))
    area.select_by_visible_text("上海")
    sleep(1)
    area.select_by_index(1)
    sleep(1)
    area.select_by_value("1")
    

    万能的XPath

    XPath即XML路径语言,支持从xml或html中查找元素节点,使用XPath完全可以替代其他定位放式,如:

    find_element_by_xpath('//*[@id=""]')等同于find_element_by_id("")
    find_element_by_xpath('//*[@name=""]')等同于find_element_by_name("")
    find_element_by_xpath('//*[@class=""]')
    

    等同于find_element_by_class_name("")
    find_element_by_xpath('//标签名')等同于find_element_by_tag_name("标签名")
    find_element_by_xpath('//a[contains(text(),"")]')
    等同于find_element_by_link_text("")
    find_element_by_xpath('//*[@id=""]')
    等同于find_element_by_partial_link_text("")

    路径
    /绝对路径: /html/body/div
    //相对路径: //div/form //*/form 路径中可以使用 *代表任意标签
    .当前路径: //div/form/. 等同于//div/form
    ..上级路径: //div/form/.. 等同于//div

    索引
    从1开始: /html/body/div[2] //div[1]/form

    属性
    @属性名:定位包含特定属性名的标签, 如//input[@class]
    @属性名="属性值":定位特定属性名=属性值的标签,如//input[@id="kw"]
    @="属性值":定位任意属性名=属性值的标签, 如 //input[@='kw']
    多属性结合定位://input[@id="kw" and @class='kw-class']或//input[@id="kw"][@class="kw-class"] (and处也支持使用or,表示或)

    函数
    text():标签中的文本值,如//a[text()="百度首页走起~"]
    contains(): 包含,如//a[contains(text(), "百度首页")]
    starts-with(): 以**开头,如//a[starts-with(text(), "百度"]
    last(): 最后一个, 如//div[last()]


    parent: 父标签
    child:子标签
    following: 后面的,如://*[text()="用户名"]/following::input[1] # 紧邻文本为用户名的输入框
    preceding:前面的

    弹出框处理
    allert警告框
    alert = driver.switch_to.alert()
    alert.accept() # 确认 或alert.dismiss() 关闭

    confirm确认框
    confirm = driver.switch_to.alert()
    confirm.accept() # 确认 或alert.dismiss() 取消

    propmt提示框
    propmt = driver.switch_to.alert()
    propmt.send_keys() 输入
    propmt.accept() # 确认 或alert.dismiss() 关闭

    模态框
    直接定位即可

    授权对话框
    在打开的url中使用用户名和密码打开,格式如下
    http://use:password@www.***.com

    框架页面处理
    iframe: 嵌入在网页body中的单独框架(框架拥有一套独立的html代码)
    frameset: 框架组,包含多个frame
    frame:每个frame引用一个独立的网页

    因为frame/iframe框架是一套独立的网页,因此frame/iframe中的元素不能直接定位到
    driver.switch_to.frame(name/id/index/Element)
    name: frame/iframe的name属性
    id: frame/iframe的id属性
    index: 如:0,第一个frame
    Element: 定位到的frame/iframe,再切换到指定frame
    driver.switch_to.parent_frame(): 切换到父级frame, 子frame之间不能相互切换
    driver.switch_to.default_content(): 跳出所有frame

    示例:

    
    from selenium import webdriver
    from time import sleep
    
    browser = webdriver.Chrome()
    browser.maximize_window()
    browser.get("urlxxx")
    
    browser.switch_to.frame("i")  #总的frame
    browser.switch_to.frame(0)
    print(browser.find_element_by_tag_name("h3").text)
    browser.switch_to.parent_frame()
    browser.switch_to.frame(1)
    print(browser.find_element_by_tag_name("h3").text)
    browser.switch_to.parent_frame()
    browser.switch_to.frame(2)
    print(browser.find_element_by_tag_name("h3").text)
    browser.switch_to.default_content()
    
    

    参考链接:https://www.jianshu.com/p/1525db9dab78
    链接:https://www.jianshu.com/p/98bd62d39a0a

    相关文章

      网友评论

        本文标题:selenium工作原理及浏览器基本操作1(元素定位、各类弹框)

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