admin 管理员组文章数量: 887053
2023年12月18日发(作者:企业模板自助建站)
一、Python+Selenium配置二、启动浏览器2.1 普通启动方式2.2 Headless启动方式三、元素定位四、selenium三种等待方式4.1 强制等待4.2 隐性等待4.3 显性等待五、浏览器操作5.1 将浏览器最大化显示5.2 将浏览器最小化显示5.3 设置浏览器宽1366、高768显示5.4 浏览器前进、后退、退出、关闭六、.操作元素对象七、键盘事件八、.鼠标事件九、.多层框架/层级定位十、Selenium速查表一、Python+Selenium配置前提条件: 已安装好Python开发环境,版本3.5以上安装步骤:1.1 打开cmd 输入pip install selenium 点击回车键,具体如下图
1.2 把下载好的放到Python安装目录下,下载方法二、启动浏览器2.1 普通启动方式#!/usr/bin/python3 # encoding:utf‐8 from selenium import webdriver #启动Firefox浏览器 #browser = x() #启动IE浏览器 #browser = () #启动Chrome浏览器 #指定驱动方式启动:(executable_path="D://") browser = () ("") 2.2 Headless启动方式说明:浏览器的无界面形态,无需打开浏览器即可运行,此种方式只chrome60+版本#!/usr/bin/python3 # encoding:utf‐8 from selenium import webdriver chrome_hless = Options() # 使用headless无界面浏览器模式 chrome__argument('‐‐headless') chrome__argument('‐‐disable‐gpu') # 启动浏览器,获取网页源代码 browser = (chrome_options=chrome_hless) mainUrl = "/" (mainUrl) print() () ''' 运行之后结果打印百度标题:百度一下,你就知道''' 三、元素定位
元素idnameclasslink_textpartial_link_texttagxpathcss定位方法find_element_by_id()find_element_by_name()find_element_by_class_name()find_element_by_link_text("全部文字匹配")find_element_by_partial_link_text("部分文字匹配")find_element_by_tag_name()find_element_by_xpath()find_element_by_css_selector()详见Python + Selenium 元素定位详细四、selenium三种等待方式4.1 强制等待固定等待XX秒时长 from selenium import webdriver import time (3) 4.2 隐性等待设置最长等待时长XX秒:第一种情况:最长等待时长内浏览器一旦加载完成,直接进行下一步操作第二种情况:超出设置最长等待时长,再进行下一步操作# 浏览器加载完成,即进行下一步操作,如果10秒钟还未加载完成,也进行下一步操作 itly_wait(10) 4.3 显性等待
WebDriverWait,配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了。它主要的意思就是:程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutExceptionwait模块的WebDriverWait类是显性等待类,先看下它有哪些参数与方法:verWait(类) initdriver: 传入WebDriver实例,即我们上例中的driver timeout: 超时时间,等待的最长时间(同时要考虑隐性等待时间) poll_frequency: 调用until或until_not中的方法的间隔时间,默认是0.5秒 ignored_exceptions: 忽略的异常,如果在调用until或until_not的过程中抛出这个元组中的异常,则不中断代码,继续等待,如果抛出的是这个元组外的异常,则中断代码,抛出异常。默认只有NoSuchElementException。 untilmethod: 在等待期间,每隔一段时间(__init__中的poll_frequency)调用这个传入的方法,直到返回值不是False message: 如果超时,抛出TimeoutException,将message传入异常 until_not与until相反,until是当某元素出现或什么条件成立则继续执行, until_not是当某元素消失或什么条件不成立则继续执行,参数也相同,不再赘述。 具如下WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)特别注意的是until或until_not中的可执行方法method参数,很多人传入了WebElement对象,如下:WebDriverWait(driver, 10).until(_element_by_id('kw')) # 错误这是错误的用法,这里的参数一定要是可以调用的,即这个对象一定有 call() 方法,否则会抛出异常:TypeError: 'xxx' object is not callable 在这里,你可以用selenium提供的expected_conditions 模块中的各种条件,也可以用WebElement的 is_displayed() 、is_enabled()、**is_selected() **方法,或者用自己封装的方法都可以WebDriverWait 常用方法表对象title_is动作判断当前页面的title是否完全匹配
对象title_containspresence_of_element_locatedvisibility_of_element_locatedvisibility_ofpresence_of_all_elements_locatedtext_to_be_present_in_elementtext_to_be_present_in_element_valueframe_to_be_available_and_switch_to_itinvisibility_of_element_locatedelement_to_be_clickablestaleness_ofelement_to_be_selectedelement_selection_state_to_beelement_located_selection_state_to_bealert_is_present动作判断当前页面的title是否包含预期字符串判断某个元素是否被加到了dom树里,并不代表该元素一定可见判断某个元素是否可见.可见代表元素非隐藏,并且元素的宽和高都不等于0跟上面的方法做一样的事情,只是上面的方法要传入locator,这个方法直接传定位到的element就好了判断是否至少有1个元素存在于dom树中。举个例子,如果页面上有n个元素的class都是'column-md-3',那么只要有1个元素存在,这个方法就返回True判断某个元素中的text是否包含了预期的字符串判断某个元素中的value属性是否包含了预期的字符串判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False判断某个元素中是否不存在于dom树或不可见判断某个元素中是否可见并且是enable的,这样的话才叫clickable等某个元素从dom树中移除,注意,这个方法也是返回True或False判断某个元素是否被选中了,一般用在下拉列表判断某个元素的选中状态是否符合预期跟上面的方法作用一样,只是上面的方法传入定位到的element,而这个方法传入locator判断页面上是否存在alert
源码举例#coding=utf‐8 from selenium import webdriver from import By from t import expected_conditions as EC from import WebDriverWait base_url = "" driver = () itly_wait(5) '''隐式等待和显示等待都存在时,超时时间取二者中最大的''' locator = (,'kw') (base_url) '''判断title是否存在,返回布尔值''' WebDriverWait(driver,10).until(_is(u"百度一下,你就知道")) if WebDriverWait(driver,10).until(_is(u"百度一下,你就知道")) : print("已找到标题百度一下,你就知道") WebDriverWait(driver,10).until(_contains(u"百度一下")) '''判断某个元素是否被加到了dom树里,并不代表该元素一定可见,如果定位到就返回WebElement''' srk = WebDriverWait(driver,10).until(ce_of_element_located((,'kw'))) #百度输入框,输入selenim _keys("selenim") '''判断某个元素是否被添加到了dom里并且可见,可见代表元素可显示且宽和高都大于0''' WebDriverWait(driver,10).until(lity_of_element_located((,'su'))) '''判断元素是否可见,如果可见就返回这个元素WebElement''' WebDriverWait(driver,10).until(lity_of(_element(by=,value='kw'))) '''判断是否至少有1个元素存在于dom树中,如果定位到就返回WebElement列表''' WebDriverWait(driver,10).until(ce_of_all_elements_located((_SELECTOR,'.mnav'))) '''判断是否至少有一个元素在页面中可见,如果定位到就返回WebElement列表''' WebDriverWait(driver,10).until(lity_of_any_elements_located((_SELECTOR,'.mnav'))) '''判断指定的元素中是否包含了预期的字符串,返回布尔值''' WebDriverWait(driver,10).until(_to_be_present_in_element((,"//*[@id='u1']/a[8]"),u'设置')) '''判断指定元素的属性值中是否包含了预期的字符串,返回布尔值''' WebDriverWait(driver,10).until(_to_be_present_in_element_value((_SELECTOR,'#su'),u'百度一下')) '''判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False''' #WebDriverWait(driver,10).until(_to_be_available_and_switch_to_it(locator)) #注意这里并没有一个frame可以切换进去 '''判断某个元素在是否存在于dom或不可见,如果可见返回False,不可见返回这个元素''' WebDriverWait(driver,10).until(bility_of_element_located((_SELECTOR,'#swfE
veryCookieWrap'))) #注意#swfEveryCookieWrap在此页面中是一个隐藏的元素 '''判断某个元素中是否可见并且是enable的,代表可点击''' WebDriverWait(driver,10).until(t_to_be_clickable((,"//*[@id='u1']/a[8]"))).click() _element_by_xpath("//*[@id='wrapper']/div[6]/a[1]").click() '''等待某个元素从dom树中移除''' #WebDriverWait(driver,10).until(t_to_be_clickable((,"//*[@id='wrapper']/div[6]/a[1]"))).click() #WebDriverWait(driver,10).until(ess_of(_element(,'su'))) #这里没有找到合适的例子 '''判断某个元素是否被选中了,一般用在下拉列表''' WebDriverWait(driver,10).until(t_to_be_selected(_element(,"//*[@id='nr']/option[1]"))) '''判断某个元素的选中状态是否符合预期''' WebDriverWait(driver,10).until(t_selection_state_to_be(_element(,"//*[@id='nr']/option[1]"),True)) '''判断某个元素的选中状态是否符合预期''' WebDriverWait(driver,10).until(t_located_selection_state_to_be((,"//*[@id='nr']/option[1]"),True)) _element_by_xpath(".//*[@id='gxszButton']/a[1]").click() '''判断页面上是否存在alert,如果有就切换到alert并返回alert的内容''' instance = WebDriverWait(driver,10).until(_is_present()) print() () () 五、浏览器操作5.1 将浏览器最大化显示ze_window() 5.2 将浏览器最小化显示ze_window() 5.3 设置浏览器宽1366、高768显示
_window_size(1366, 768) 5.4 浏览器前进、后退、退出、关闭d()#前进 ()#后退 ()#退出 ()#关闭 六、.操作元素对象对象-clear()send_keys()click()submit()textget_attribute()源码举例#coding=utf‐8 from selenium import webdriver from import By from t import expected_conditions as EC from import WebDriverWait base_url = "" driver = () (base_url) itly_wait(5) #clear() 清空 _element(,'kw').clear() #send_keys()输入框键盘输入select _element(,'kw').send_keys("select") #click()点击对象 _element(,'su').click() 动作清空键盘操作点击提交获取对象文本获取对象属性值
#submit()提交,注意类型type=‘submit’ _element(,'su').submit() #text获取元素文本值 button_name = _element_by_id('su').text #get_attribute("type") 获取属性值 button_type = _element_by_id('su').get_attribute("type") if button_type == "submit": print("type为submit") 七、键盘事件对象send_keys()send_keys()send_keys(Keys.F12)send_keys(L,'a')源码举例#coding=utf‐8 from selenium import webdriver import time #键盘操作必须输入包 from import Keys driver = () ("") itly_wait(5) bdsrk = _element_by_id('kw') _keys('输入') #TAB _keys() (3) #回车 _keys() (3) #ctrl+a 全选输入框内容 _element_by_id("kw").send_keys(L,'a') (3) #F12 动作TAB回车F12ctrl+a
_keys(Keys.F12) () 八、.鼠标事件对象clickcontext_click()double_click()drag_and_drop()move_to_element()click_and_hold源码举例#coding=utf‐8 from selenium import webdriver import time #鼠标操作必须输入包 from _chains import ActionChains driver = () ("") itly_wait(5) bdsrk = _element_by_id('kw') #百度一下按钮 bdan = _element_by_id('su') #视频链接 dt =_element_by_name("tj_trtieba") (3) #单击 () (3) #右击 ActionChains(driver).context_click(bdsrk).perform() (3) #双击 ActionChains(driver).double_click(bdan).perform() (3) #鼠标拖放 从百度一下按钮拖动到新闻链接位置 ActionChains(driver).drag_and_drop(bdan,dt) 动作单击右击双击拖动鼠标悬停按下鼠标左键在一个元素上
(3) #鼠标悬停 ActionChains(driver).move_to_element(dt).perform() (3) () 九、.多层框架/层级定位定位元素过程中经常会遇到找不到元素的问题,出现该问题一般都是以下因素导致:元素定位方法不对页面存在iframe或内嵌窗口页面超时 webdriver 提供了一个 switch_to_frame 方法,可以很轻松的来解决这个问题。#先找到到 ifrome1(id = from1) _to_frame("from1") 十、Selenium速查表异常WebDriverExceptionInvalidSwitchToTargetExceptionNoSuchFrameExceptionNoSuchWindowExceptionNoSuchElementExceptionNoSuchAttributeExceptionStaleElementReferenceExceptionUnexpectedAlertPresentException描述所有webdriver异常的基类,当有异常且不属于下列异常时抛出下面两个异常的父类,当要switch的目标不存在时抛出当你想要用switch_()切入某个不存在的frame时抛出当你想要用switch_()切入某个不存在的window时抛出元素不存在,一般由find_element与find_elements抛出一般你获取不存在的元素属性时抛出,要注意有些属性在不同浏览器里是有不同的属性名的指定的元素过时了,不在现在的DOM树里了,可能是被删除了或者是页面或iframe刷新了出现了意料之外的alert,阻碍了指令的执行时抛出
异常NoAlertPresentExceptionInvalidElementStateExceptionElementNotVisibleExceptionElementNotSelectableExceptionInvalidSelectorExceptionInvalidCookieDomainExceptionUnableToSetCookieExceptionTimeoutExceptionMoveTargetOutOfBoundsExceptionUnexpectedTagNameExceptionImeNotAvailableExceptionImeActivationFailedExceptionErrorInResponseExceptionRemoteDriverServerException描述你想要获取alert,但实际没有alert出现时抛出下面两个异常的父类,当元素状态不能进行想要的操作时抛出元素存在,但是不可见,不可以与之交互当你想要选择一个不可被选择的元素时抛出一般当你xpath语法错误的时候抛出这个错当你想要在非当前url的域里添加cookie时抛出当driver无法添加一个cookie时抛出当一个指令在足够的时间内没有完成时抛出actions的move操作时抛出,将目标移动出了window之外获取到的元素标签不符合要求时抛出,比如实例化Select,你传入了非select标签的元素时输入法不支持的时候抛出,这里两个异常不常见,ime引擎据说是仅用于linux下对中文/日文支持的时候激活输入法失败时抛出不常见,server端出错时可能会抛出不常见,好像是在某些情况下驱动启动浏览器失败的时候会报这个错
版权声明:本文标题:Python Selenium 常用功能(实战详解) 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1702909375h435578.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论