zoukankan      html  css  js  c++  java
  • Selenium3+python3自动化--使用小结

    一、安装

    安装selenium库,pip install selenium

    安装特定于浏览器的WebDriver二进制文件(如,谷歌的chromedriver),需添加系统path环境变量(简单方式:直接将chromedriver放在python目录下)

    Selenium通过使用WebDriver支持市场上所有主流浏览器的自动化。

    WebDriver(驱动程序)是一个API和协议,用于控制web浏览器的行为。

    实例化Chrome会话

    from selenium import webdriver
    driver=webdriver.Chrome()  

    二、定位元素

    WebDriver中有8种不同的内置元素定位策略:

    id、name、xpath、css selector、link text、partial link text、class name、tag name、

    WebElement表示DOM元素,网络元素

    find_element_by_xx("xxx")

    find_elements_by_xx("xxx")

    find_element("xx","xxx")定位一个元素:driver.find_element(By.NAME,"值")  #同driver.find_element("name","值")

    find_elements("xx","xxx")定位一组元素:driver.find_elements(By.TAG_NAME,"值") #同driver.find_elements("tag name","值")

     xpath语法:driver.find_element_by_xpath("//*[@class='s_ipt']").send_keys("xi")

          driver.find_element_by_xpath("//input[@class='s_ipt']").send_keys("xi")

          //表示相对位置;/表示层级;*表示任意标签,也可以通过标签筛选下(input);[]可以填写任意属性;

    class定位:一个元素可以有多个class的属性名称(如,新闻按钮:class="mnav c-font-normal c-color-t"),使用空格作为间隔符号

        直接定位driver.find_elements_by_class_name("mnav c-font-normal c-color-t"),定位不到,可以取其中的一个属性:如,mnav 或 c-font-normal 或 c-color-t

        xpath定位的话,直接使用带空格的class属性值

    driver.find_elements_by_xpath("//div[@id='s-top-left']/a[@class='mnav c-font-normal c-color-t']") #只取部分,定位不到
       css定位的话,可以使用多个class属性,也可以使用单个class属性,使用.表示class属性,#表示id属性
    driver.find_elements_by_css_selector(".mnav.c-font-normal.c-color-t")
    driver.find_elements_by_css_selector(".mnav")
    driver.find_elements_by_css_selector("[class='mnav c-font-normal c-color-t']") #只取部分,定位不到
       

    css定位:driver.find_element_by_css_selector("#kw").send_keys(字符串");

         driver.find_element_by_css_selector(" [autocomplete='off']").send_keys("字符串")

        driver.find_element_by_css_selector("input [autocomplete='off']").send_keys("字符串")

        #表示id;.表示class属性;标签无任何标识符;任意属性[id='kw'] 或 [autocomplete='off']

        ()内写入:#id的值 或 .class的值 或 标签 或 [id='kw']

        >层级;*表示任意标签

    #点击新闻按钮
    # driver.find_elements_by_xpath("//div[@id='s-top-left']/a")[0].click()
    # driver.find_elements_by_css_selector("div#s-top-left>a")[0].click()
    driver.find_elements_by_css_selector("*#s-top-left>a")[0].click()
    # driver.find_element_by_css_selector("div[id='s-top-left']>a:nth-child(1)").click()

      获取元素相关的值:t=driver.find_element_by_id("id值")

             获取元素的文本属性:t.text;

             获取元素的某属性值:t.get_attribute("属性名")

               获取输入框的文本值:t.get_attribute("value")

             获取元素的标签:t.tag_name         

    获取页面title:driver.title

    获取浏览器名称:driver.name

    获取页面源码:s=driver.page_source  #可以配合re,提取需要的值 re.findall(正则表达式,s)  

    输入框输入字符串:.send_keys()

    清空输入框内容:.clear()

    鼠标左键点击:.click()

    回车键:.submit()

    切换(浏览器)窗口/标签:n=driver.window_handles;driver.switch_to.window(n[-1])

    切换iframe:定位 t=driver.find_element_by_xpath("iframe的路径");切换 driver.switch_to.frame(t);#释放iframe,返回主页面:driver.switch_to.default_content()

    处理富文本:切换到iframe  ;定位、操作(和普通的输入框是一样);释放iframe;

    处理弹窗alerts/confirm/prompt:t=driver. switch_to.alert();t.accept(),t.dismiss(),t.send_keys("内容")

    单选框:.click()

    复选框:.click();可以先判断是否勾选:.is_selected() 未选中是False,选中是True

    select下拉框:和普通的定位是一样的 .click()

    table表格:和常见操作一样的

    上传图片:(input标签的图片)定位、上传 driver.find_element_by_id("id的值").send_keys("E:\qq.png")

    三、等待

    显示等待:导入模块:from selenium.webdriver.support.wait import WebDriverWait

         WebDriverWait与until、until_not、expected_conditions、匿名函数结合使用

         导入expected_conditions模块:from selenium.webdriver.support import expected_conditions as EC

         w=WebDriverWait(driver,10)

         w.until(EC.presence_of_element_located(("id","kw")).send_keys("he")

         w.until(lambda x:x.find_element_by_id("kw")).send_keys("he")

    强制等待:import time

         sleep(5) #等待5秒

    隐式等待:driver.implicitly_wait(10) #隐式等待10秒

    四、判断元素是否存在

    1.可以写一个方法 使用到find_elements("id","kw") ;查看返回值(集合)的长度,长度为0,则被找到;长度为1,找到1个;长度>1,找到多个;

    2.使用expected_conditions;

      EC.title_is("xx")(driver) #判断当前页面的title是否完全等于(==)预期字符串

      EC.title_contains("x"(driver)  #包含

      presence_of_element_located:判断某个元素是否被加到dom树里,并不代表该元素一定可见

      alert_is_present()(driver):#判断页面上是否存在alert

      EC.text_to_be_present_in_element(("xx","xxx"),"期望内容")(driver)#判断文本,返回True 或 Fasle #("xx","xxx")即locator,语法同find_element()括号中内容

      EC.text_to_be_present_in_element_value(("xx","xxx"),"期望内容")(drvier) #判断这个期望的内容与定位的value属性的值一样?

    捕获异常:为了让程序继续执行,可以使用try...except捕获异常

    try:

      。。。

    except Exception as e:

      print(e)  

    五、截图

    截取全屏

      driver.save_screenshot("D:\a.png")

      driver.save_screenshot_as_file("D:/b.png")

    截取某个元素的图

    方式1:定位元素,保存图片

    s=driver.find_element_by_id("kw")
    s.screenshot("E:\991.png")

    方式2:定位元素,获取坐标x,y,尺寸宽、高

      from PIL import Image

      t=driver.find_element_by_id("kw")

      元素坐标:s.location,元素大小:t.size

      i=Image.open("D:/b.png")

      i.crop(t.location['x], t.location['y'], t.location['x']+t.size['width'], t.location['y']+t.size['height'])

      i.save("D:\c.png")

    六、js操作

    定位:单数:Id;复数:Name,ClassName,TagName

    去掉x属性:j='document.getElementById("id属性的值").removeAttribute("x")’

    修改x属性值为空:j='document.getElementsByClassName("class属性的值")[0].x=""'

    控制浏览器滚动条滚动到底部、顶部:'window.scrollTo(0,document.body.scrollHeight)' ;'window.scrollTo(0,0)'

    富文本填写内容

    js="window.document.getElementsByTagName('iframe')[0].contentWindow.document.body.innerHTML='{}'".format("js填写的富文本")

    输入框填写内容:.value="内容"

    清空输入框内容:.value=""

    处理内嵌div滚动条:j='document.getElementById("xx").scrollTop=0' #顶部;底部.scrollTop=1000

             j='document.getElementsByName("yy").scrollLeft=0' #左侧;右侧.scrollLeft=1000

    执行js:driver.execute_script(j)

    from selenium import webdriver
    import time
    driver=webdriver.Chrome()
    driver.get("https://www.baidu.com")
    js='document.getElementById("kw").value="xixi"' #单数 #发送文本
    # js='document.getElementsByName("wd")[0].value="hello"' #复数
    # js='document.getElementsByClassName("s_ipt")[0].value="good"'
    # js='document.getElementById("kw").removeAttribute("autocomplete")' #去掉autocomplete属性
    # js='document.getElementsByName("wd")[0].autocomplete=""' #修改autocomplete属性值为空
    # js='window.scrollTo(0,document.body.scrollHeight)'#滚动条 滚动到底部
    # driver.execute_script(js)
    # time.sleep(6)
    # js='window.scrollTo(0,0)'#滚动条 滚动到顶部
    
    #js填写富文本的信息
    # js="window.document.getElementsByTagName('iframe')[0].contentWindow.document.body.innerHTML='{}'".format("js填写的富文本")
    driver.execute_script(js)
    
    js='document.getElementById("su").click()' #点击百度一下
    driver.execute_script(js)
    time.sleep(3)
    js='document.getElementById("kw").value=""' #清空搜索框的内容
    driver.execute_script(js)  

    七、浏览器导航

    打开网站:driver.get(url)

    获取当前url:driver.current_url

    后退:driver.back()

    前进:driver.forward()

    刷新:driver.refresh()

    获取标题:driver.title

    窗口和标签页:当前窗口的id,id=driver.current_window_handle

           所有窗口的id集合,ids=driver.window_handles

    切换窗口或标签页:switch_to.window(ids[-1])

    关闭窗口或标签页:driver.close()

    退出浏览器:driver.quit()

    切换到frame或iframe上

    方式1:定位框架元素;切换到该框架driver.switch_to.frame(元素);操作框架里的元素

    方式2:通过name或id切换框架driver.switch_to.frame(name或id属性值);操作框架里的元素

    方式3:使用索引,如切换到第2个框架driver.switch_to.frame(1)

    离开框架:切换到默认内容,driver.switch_to.default_content()

    获取窗口大小:driver.get_window_size().get("width")

           driver.get_window_size().get("height")

    设置窗口大小:driver.set_window_size(1024,768)

    得到窗口的位置

    driver.get_window_position().get('x)

    driver.get_window_position().get('y')

    设置窗口位置:driver.set_window_position(0,0)

    最大化窗口:driver.maximize_window()

    最小化窗口:driver.mimimize_window()

    全屏窗口(类似F11):driver.fullscreen_window()

    屏幕截图:driver.save_screenshot("E:\a.png")

    元素屏幕截图:如百度搜索框

    driver.find_element_by_id("kw").screenshot("a.png")

    八、JavaScript 提供的三种类型的原生弹窗消息,警告框,提示框和确认框

     Alerts 警告框、Confirm 确认框、Prompt 提示框

    切换到弹窗:a=driver.switch_to.alert

    获取弹出中的文本:a.text

    确定按钮:a.accept()

    取消按钮:a.dismiss()

    提示框,输入内容:a.send_keys(你想要输入的字符串)

    九、键盘事件Keyboard、鼠标事件Mouse;PyUserInput模块下的PyKeyboard、PyMouse

    键盘事件

    方式1:

    需要导入键盘模块:from selenium.webdriver.common.keys import Keys

    操作回车按钮:driver.find_element("id","值").send_keys(Keys.ENTER)

    Ctrl+C:send_keys(Keys.CONTROL,"c")

    制表键Tab:send_keys(Keys.TAB)

    方式2:

    导入 键盘模块:from pykeyboard import PyKeyboard

    kb=PyKeyboard()

    # kb.press_key(kb.tab_key) #按下tab键

    # kb.release_key(kb.tab_key) #释放tab键

    kb.tap_key(kb.tab_key) #按下tab键、释放tab键

    kb.tap_key("h") #输入字符h

    kb.tap_key(kb.enter_key) #回车键

    鼠标事件

    方式1:

    需要导入鼠标模块:from selenium.webdriver.common.action_chains import ActionChains

    i=driver.find_element_by_id("值")

    鼠标悬停在某元素上:ActionChains(driver).move_to_element(i).perform()

    左键单击某元素且不释放:ActionChains(driver).click_and_hold(i).perform()

    释放按下的鼠标左键,它将释放给定WebElement上按下的鼠标左键:ActionChains(driver).release().perform()

    右键单击:ActionChains(driver).context_click(i).perform()

    双击 :ActionChains(driver).double_click(i).perform()

     方式2:

    导入鼠标模块:from pymouse import PyMouse

     十、cookie

    Cookie是从网站发送并存储在您的计算机中的一小段数据。Cookies主要用于识别用户并加载存储的信息。

    添加Cookie:driver.add_cookie({"name":"值1", "键2":"值2",...}) #可以使用代码登录,手动输入验证码,获取所有cookie,然后取出需要的部分,添加cookie时,使用 

    获取指定name的Cookie:driver.get_cookie(name="值1")

    获取全部Cookies:driver.get_cookies()

    删除指定Cookie:driver.delete_cookie(name="值1") #"name="可省略

    删除所有cookies:driver.delete_all_cookies()

    十一、显示浏览器、静默模式启动浏览器 不显示浏览器

    from selenium import webdriver

    driver=webdriver.Chrome()  #启动浏览器,显示浏览器

    option=webdriver.ChromeOptions()

    option.add_argument('headless')

    d=webdriver.Chrome(options=option)  #不显示浏览器

    越努力,越幸运!!! good good study,day day up!!!
  • 相关阅读:
    vue移动端适配问题
    excel 表格数据转json格式
    常用快捷键
    微信公众号监听返回事件
    总结css常用方法
    封装axios
    初学angular项目中遇到的一些问题
    jquery项目中一些常用方法
    怎样做ie兼容性
    vue事件修饰符
  • 原文地址:https://www.cnblogs.com/canglongdao/p/13621034.html
Copyright © 2011-2022 走看看