首页 文章 精选 留言 我的

精选列表

搜索[selenium],共522篇文章
优秀的个人博客,低调大师

selenium的文档API

你用WebDriver要做的第一件事就是指定一个链接,一般我们使用get方法: fromseleniumimportwebdriver fromselenium.webdriver.common.keysimportKeys driver=webdriver.Chrome(r'D:\chrome\Google\Chrome\Application\chromedriver.exe') driver.get("https://www.baidu.com/") 你可以用下列任意方法找到它: element=driver.find_element_by_id("passwd-id") element=driver.find_element_by_name("passwd") element=driver.find_element_by_xpath("//input[@id='passwd-id']") content=driver.find_element_by_css_selector('p.content') 等等 fromseleniumimportwebdriver importtime driver=webdriver.Chrome(r'D:\chrome\Google\Chrome\Application\chromedriver.exe') driver.get("https://www.baidu.com/") inputClass=driver.find_element_by_id('kw') time.sleep(3) inputClass.send_keys("python") inputClass.clear() 这里我们举个例子就是请求百度然后输入python然后再删除掉,inputClass.clear()就是清楚搜索框内容假如前面就有内容的话可以先删除掉再输入,这里的kw就是搜索框id 然后我们需要再给我们搜索 fromseleniumimportwebdriver importtime driver=webdriver.Chrome(r'D:\chrome\Google\Chrome\Application\chromedriver.exe') driver.get("https://www.baidu.com/") inputClass=driver.find_element_by_id('kw') inputClass.send_keys("python") time.sleep(3) button=driver.find_element_by_id("su") button.click() 然后我们就可以通过page_source获取搜索后的源代码然后就是beautifulsoup等等包继续获取了 在窗口(window)和框架(frame)间移动现在的网页应用里没有页面框架或者只用一个窗口就包含了所有内容的已经很少了。WebDriver 支持在指定的窗口间移动,方法为switch_to_window: driver.switch_to_window("windowName") 这个switch_to_window用的是target标签现在所有的driver的调用都会指向这个给定的窗口,但是我们怎么知道窗口的名字是什么呢?可以看一看打开这个窗口的javascript脚本或者link链接: Clickheretoopenanewwindow 行为链ActionChains可以完成简单的交互行为,例如鼠标移动,鼠标点击事件,键盘输入,以及内容菜单交互。这对于模拟那些复杂的类似于鼠标悬停和拖拽行为很有用 不管怎样,这些动作总是一个接一个按他们被调用的顺序执行。 click(on_element=None) 点击一个元素 参数: * on_element:要点击的元素,如果是None,点击鼠标当前的位置 click_and_hold(on_element=None) 鼠标左键点击一个元素并且保持 参数: * on_element:同click()类似 double_click(on_element=None) 双击一个元素 参数: * on_element:同click()类似 drag_and_drop(source, target) 鼠标左键点击source元素,然后移动到target元素释放鼠标按键 参数: source:鼠标点击的元素 target:鼠标松开的元素 drag_and_drop_by_offset(source, xoffset,yoffset) 拖拽目标元素到指定的偏移点释放 参数: source:点击的参数 xoffset:X偏移量 * yoffset:Y偏移量 key_down(value,element=None) 只按下键盘,不释放。我们应该只对那些功能键使用(Contril,Alt,Shift) 参数: value:要发送的键,值在Keys类里有定义 element:发送的目标元素,如果是None,value会发到当前聚焦的元素上 例如,我们要按下 ctrl+c: ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()key_up(value,element=None) 释放键。参考key_down的解释 move_by_offset(xoffset,yoffset) 将当前鼠标的位置进行移动 参数: xoffset:要移动的X偏移量,可以是正也可以是负 yoffset:要移动的Y偏移量,可以是正也可以是负 move_to_element(to_element) 把鼠标移到一个元素的中间 参数: * to_element:目标元素 move_to_element_with_offset(to_element,xoffset,yoffset) 鼠标移动到元素的指定位置,偏移量以元素的左上角为基准 参数: to_element:目标元素 xoffset:要移动的X偏移量 * yoffset:要移动的Y偏移量 perform() 执行所有存储的动作 release(on_element=None) 释放一个元素上的鼠标按键, 参数: * on_element:如果为None,在当前鼠标位置上释放 send_keys(*keys_to_send) 向当前的焦点元素发送键 参数: * keys_to_send:要发送的键,修饰键可以到Keys类里找到 send_keys_to_element(element,*keys_to_send) 向指定的元素发送键

优秀的个人博客,低调大师

Selenium之页面元素定位

单个元素定位 WebDriver提供了八种页面元素定位的方法,下面来依次为大家介绍一下: id定位:find_element_by_id("") HTML页面规定了id属性在HTML文档中必须是唯一的(页面id不唯一时,在编辑器中会标红显示,但是页面依然能正常加载)。id定位方法就是通过元素的id属性来查找元素,比如通过id定位百度输入框: find_element_by_id("kw") name定位:find_element_by_name("") HTML页面元素中有时候会指定name属性,有name属性的元素可以通过name进行定位,但要注意name属性在同一个页面可能存在多个相同的元素. 通过name属性定位百度输入框: find_element_by_name("wd") class定位:find_element_by_class_name("") class定位方式与id、name类似,下面通过class定位百度输入框: find_element_by_class_name("s_ipt") tag定位:find_element_by_tag_name("") 通过html元素的标签类型去定位元素,这个在页面中会存在很多tag name相同的元素,用这种方式识别元素的概率很低。 find_element_by_class_name("input")find_element_by_class_name("div") link定位:find_element_by_link_text() link通常用来定位文本链接,比如百度首页上方的链接就可以通过link的方式定位: find_element_by_link_text("新闻")find_element_by_link_text("hao123")find_element_by_link_text("地图") partial link定位:driver.find_element_by_link_text() partial link定位是对link定位的一种补充,有些文本链接会比较长,这个时候可以取文本链接的一部分进行定位,只要这一部分信息可以唯一地标识这个链接。 一个很长很长很长的文本链接find_element_by_link_text("一个很长的")find_element_by_link_text("很长的文本链接") xpath定位:driver.find_element_by_xpath() xpath有很多种定位策略,最简单直观的就是写出元素的绝对路径: xpath-利用绝对路径定位如果一个层级下有多个相同的标签名时,那么就按上下顺序确定是第几个,比如div[2]表示当前层级下的第二个div标签。 find_element_by_xpath("/html/body/div/div[2]/div/form/span[2]/input") xpath-利用元素属性定位 find_element_by_xpath("//input[@id='kw']") //表示当前页面某个目录下,imput表示定位元素的标签名,[@id='kw']表示这个元素的id属性值等于kw。下面演示通过name和class定位: find_element_by_xpath("//input[@name='wd']")find_element_by_xpath("//input[@class='s_ipt']")find_element_by_xpath("//*[@class='bg_s_btn']") 如果不想指定标签名,则也可以用星号(*)代替。用xpath不局限与id,name,class等属性,元素的任意属性值都可以使用,只要它能唯一的标识一个元素。 find_element_by_xpath("//input[@maxlength='100']")find_element_by_xpath("//input[@autocomplete='off']")find_element_by_xpath("//input[@type='submit']") xpath-利用层级和属性结合起来定位 如果一个元素本身没有可以唯一标识这个元素的属性值,那么我们可以往上找其对应的其他层级是否有可以唯一标识属性的值,也可以拿来使用。 find_element_by_xpath("//form[@id='form']/input")find_element_by_xpath("//form[@id='form']/span[2]/input") xpath-使用逻辑运算符连接多个属性值定位 如果一个属性不能唯一地区分一个元素,我们还可以使用逻辑运算符连接多个属性来查找元素。 比如:现在有以下一段元素要定位: ............ 此时,要定位第一行的input元素,就可以采用下面的写法: find_element_by_xpath("//input[@id='kw'and@class='su']") xpath定位除以上几种方式手写定位外,谷歌浏览器还可以借助浏览器自带的功能进行xpath元素定位的复制,火狐浏览器还可以借助FireBug插件进行元素xpath等方式定位复制。下面演示一下如果在谷歌浏览器上复制百度首页某个元素的xpath路径: 1、鼠标选中要定位的元素,右键->选择检查 2、选择屏幕下方高亮的元素,右键->copy->copy xpath /copy full xpath,然后粘贴即可 copy xpath:会根据工具智能的复制出精简的xpath路径, copy full xpath:复制的是全路径的绝对地址定位元素,但这2种方式复制出来的路径并不能保证100%就一定可用,有时候需要自己再进行一些调整。 CSS定位:find_element_by_css_selector(".s_ipt") css可以比较灵活的选择控件的任意属性,一般情况下定位速度要比xpath快,但对于初学者来说的话,学习起来稍微有点难度,下面就简单地介绍一下css的语法和使用。 css选择器的常见语法 选择器 例子 描述 .class .intro class选择器,选择class="intro"的所有元素 #id #kw id选择器,选择id="kw"的所有元素 * * 选择所有元素 element p 元素所有元素 element > element div > input 选择父元素为的所有元素 element + element div + input 选择同一级中紧接在元素之后的所有元素 [attribute=value] [target=_blank] 选择target="_blank"的所有元素 具体用法演示: 1、通过class属性定位find_element_by_css_selector(".s_ipt")2、通过id属性定位find_element_by_css_selector("#kw")3、通过标签定位find_element_by_css_selector("input")4、通过父子关系定位find_element_by_css_selector("span>input")5、通过属性定位find_element_by_css_selector("[autocomplete=off]")find_element_by_css_selector("[name=kw]")6、组合定位find_element_by_css_selector("form.fm>span>input.s_ipt")find_element_by_css_selector("form#form>span>input#kw") 以上简单的介绍了8中定位方法,WebDriver还提供了另外一套写法,即统一调用find_element()方法,通过By来声明定位的方法,并且传入对应定位方法的定位参数。具体如下: •find_element(By.ID,"loginName")•find_element(By.NAME,"SubjectName")•find_element(By.CLASS_NAME,"u-btn-levred")•find_element(By.TAG_NAME,"input")•find_element(By.LINK_TEXT,"退出")•find_element(By.PARTIAL_LINK_TEXT,"退")•find_element(By.XPATH,"//*[@id='Title']")•find_element(By.CSS_SELECTOR,"[type=submit]") 其实前面8中定位方法,底层也是调用的find_element()方法: deffind_element_by_id(self,id_): """Findsanelementbyid. :Args: -id\_-Theidoftheelementtobefound. :Returns: -WebElement-theelementifitwasfound :Raises: -NoSuchElementException-iftheelementwasn'tfound :Usage: element=driver.find_element_by_id('foo') """ returnself.find_element(by=By.ID,value=id_) find_element(),find_elements()区别 细心的同学会发现,在使用的时候,除了find_element()之外,还会有一个find_elements()方法,那么他们两有什么区别呢? 1.只查找一个元素的时候:可以使用find_element(),find_elements() find_element()会返回一个WebElement节点对象,但是没找到会报错,而find_elements()不会,之后返回一个空列表 2.查找多个元素的时候:只能用find_elements(),返回一个列表,列表里的元素全是WebElement节点对象 3.如果想要获取元素相关内容,find_element()可直接获取,find_elements()需要获取列表某个指定元素之后才能获取相关内容 一组元素定位 前面已经介绍了单个元素定位的方法,这里再介绍一种定位一组元素的方法: 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() 看出区别了吗?这几个方法在element后面加了一个s,能够定位多个属性相同的元素,返回的是一个元素对象的数组,定位不到时,返回的是一个空数组,不会报元素找不到的异常。 应用场景:比如下拉框的时候 ,先定位获取下拉框的所有选项,再循环遍历,找到满足条件的某个元素,选中或者做其他操作。

优秀的个人博客,低调大师

Selenium--数据驱动(python)

前言: 什么是数据驱动? 从它的本意来解释,就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。其实就是参数化。 本次介绍2种文件驱动:ini文件和yaml文件 一、ini文件 1、定义 程序没有任何配置文件,那么它对外是全封闭的,一旦程序需要修改一些参数必须要修改程序代码本身并重新编译,为了让程序出厂后还能根据需要进行必要的配置,所以要用配置文件;配置文件有很多种,如INI配置文件,XML配置文件,cfg配置文件,还有就是可以使用系统注册表等。 INI ”就是英文 “initialization”的头三个字母的缩写;当然INI file的后缀名也不一定是".ini"也可以是".cfg",".conf ”或者是".txt"。 2、经典格式 INI文件的格式很简单,最基本的三个要素是:parameters,sections和comments。 INI所包含的最基本的“元素”就是parameter;每一个parameter都有一个name和一个value 所有的parameters都是以sections为单位结合在一起的。所有的section名称都是独占一行,并且sections名字都被方括号包围着,在section声明后的所有parameters都是属于该section 在INI文件中comments注释语句是以分号“;”开始的 3、具体文件举例 image 4、python读写ini方法 需要导入Python自带的模块, 用来读写配置文件: import ConfigParser **读取ini文件**: read(filename):读取ini文件中的内容 sections():得到所有section,返回列表形式 options(section):得到给定section的所有option items(section):得到指定section的所有key-value get(section,option):得到section中的option值,返回str类型 getint(section,option):得到section中的option值,返回int类型 写入ini文件: write(filename):写入ini文件中的内容 add_section(section):写入指定section Set(section,option,value):写入指定section中的option的值 5、读取ini文件具体代码范例 import configparser # ======== Reading mail_config.ini setting =========== cf = configparser.ConfigParser() cf.readfp(open("D:\\API\\config\\mail_config.ini")) smtpserver = cf.get("mail", "smtpserver") sender = cf.get("mail", "sender")receiver = cf.get("mail", "receiver") username = cf.get("mail", "username")password = cf.get("mail", "password") 6、写入ini文件具体代码范例 import configparser # ======== write 1.ini setting =========== config = configparser.ConfigParser() # set a number of parameters config.add_section("book") config.set("book", "title", "the python standard library") config.set("book","author", "fredrik lundh") config.add_section("ematter") config.set("ematter", "pages","250") # write to fileconfig.write(open('1.ini', "w")) 二、yaml文件 1、YAML定义 YAML的官方定义很简单,即“一种人性化的数据格式定义语言”,其主要功能用途类似于XML或JSON,YAML使用空白字符和分行来分隔数据,且巧妙避开各种封闭符号,如:引号、括号等,以避免这些符号在复杂层次结构中变得难以辨认。YAML的语法与高阶语言类似,可以很简单地表述“序列(java中的list)、杂凑表(java中的map)、标量(java中的基本类型等)”数据结构,它重点强调可阅读性。 2、YAML用途 YAML比较适合做序列化。因为它是宿主语言数据类型直转的。 YAML做配置文件也不错。写YAML要比写XML快得多(无需关注标签或引号),并且比ini文档功能更强。 3、YAML vs XML 与YAML相似的数据格式定义语言是XML,YAML比XML优越性表现在 YAML的可读性好 YAML和脚本语言的交互性好 YAML使用实现语言的数据类型 YAML有一个一致的信息模型 YAML易于实现 上面5条是XML不足的地方,同时,YAML也具有XML的下列优点: YAML可以基于流来处理 YAML表达能力强,扩展性好 YAML类似于XML的数据描述语言,语法比XML简单很多,YAML试图用一种比XML更敏捷的方式,来完成XML所完成的任务。 4、YAML-对象示例 YAML 支持的数据结构有三种。 -对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary) -数组:一组按次序排列的值,又称为序列(sequence) / 列表(list) -纯量(scalars):单个的、不可再分的值 image 5、python读取YAML文件 代码片段如下: import yaml # ======== Reading mail.yaml setting =========== fr = open("D:\\API\\config\\mail.yaml") get_config = yaml.load(fr) smtpserver = get_config["smtpserver"] sender = get_config["sender"] receiver = get_config["receiver"] username = get_config["username"] password = get_config["password"] 以上为最简单的用法,大家如有兴趣可以自行延伸学习~~

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册