Python+Selenium详解(超全)
⼀、Selenium+Python环境搭建及配置
1.1 selenium 介绍
selenium 是⼀个 web 的⾃动化测试⼯具,不少学习功能⾃动化的同学开始⾸选 selenium ,因为它相⽐ QTP 有诸多有点:
免费,也不⽤再为破解 QTP ⽽⼤伤脑筋⼩巧,对于不同的语⾔它只是⼀个包⽽已,⽽ QTP 需要下载安装1个多 G 的程序。这也是最重要的⼀点,不管你以前更熟悉 C、 java、
ruby、python、或都是 C# ,你都可以通过 selenium 完成⾃动化测试,⽽ QTP 只⽀持 VBS⽀持多平台:windows、linux、MAC ,⽀持多浏览器:ie、ff、safari、opera、
chrome⽀持分布式测试⽤例的执⾏,可以把测试⽤例分布到不同的测试机器的执⾏,相当于分发机的功能。1.2 selenium+Python环境配置
前提条件:已安装好Python开发环境(推荐安装Python3.5及以上版本)
安装步骤:
安装seleniumWin:pip install seleniumMac:pip3 install selenium安装webdriver注:webdriver需要和对应的浏览器版本以及selenium版本对应webdriver安装路径Win:复制
webdriver到Python安装⽬录下Mac:复制webdriver到/usr/local/bin⽬录下⼆、元素定位及浏览器基本操作
2.1 启动浏览器
2.1.1 普通⽅式启动
启动Chrome浏览器:
from selenium import webdriverbrowser = webdriver.Chrome()('URL')
启动Firefox浏览器:
from selenium import webdriverbrowser = webdriver.Firefox()('URL')
启动IE浏览器:
from selenium import webdriverbrowser = webdriver.Ie()('URL')
2.1.2 Headless⽅式启动
Headless Chrome 是 Chrome 浏览器的⽆界⾯形态,可以在不打开浏览器的前提下,使⽤所有 Chrome ⽀持的特性运⾏你的程序。相⽐于现代浏览器,Headless Chrome 更加
⽅便测试 web 应⽤,获得⽹站的截图,做爬⾍抓取信息等。相⽐于较早的 PhantomJS,SlimerJS 等,Headless Chrome 则更加贴近浏览器环境。
Headless Chrome 对Chrome版本要求:官⽅⽂档中介绍,mac和linux环境要求chrome版本是59+,⽽windows版本的chrome要求是60+,同时chromedriver要求2.30+版本。
from selenium import webdriverfrom selenium.webdrivermon.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import
expected_conditions as ECfrom selenium.webdrivermon.action_chains import ActionChainsfrom selenium.webdrivermon.keys import Keyschrome_options =
webdriver.ChromeOptions()# 使⽤headless⽆界⾯浏览器模式chrome_options.add_argument('--headless') //增加⽆界⾯选项chrome_options.add_argument('--disable-gpu') //如
果不加这个选项,有时定位会出现问题# 启动浏览器,获取⽹页源代码browser = webdriver.Chrome(chrome_options=chrome_options)mainUrl =
"(mainUrl)print(f"browser text = {browser.page_source}")browser.quit()
2.1.3 加载配置启动浏览器
Selenium操作浏览器是不加载任何配置的,下⾯是关于加载Chrome配置的⽅法:
⽤Chrome地址栏输⼊chrome://version/,查看⾃⼰的“个⼈资料路径”,然后在浏览器启动时,调⽤这个配置⽂件,代码如下:
#coding=utf-8from selenium import webdriveroption = webdriver.ChromeOptions()option.add_argument('--user-data-
dir=C:\Users\Administrator\AppData\Local\Google\Chrome\User Data') #设置成⽤户⾃⼰的数据⽬录driver=webdriver.Chrome(chrome_options=option)
⽽加载Firefox配置的⽅法有些不同:
打开Firefox点右上⾓设置>?(帮助)>故障排除信息>显⽰⽂件夹,打开后把路径复制下来就可以了
# coding=utf-8from selenium import webdriver# 配置⽂件地址profile_directory = r'C:\Users\\xxx\AppData\Roaming\Mozilla\Firefox\Profiles\1x41j9of.default'# 加载配置配置profile
= webdriver.FirefoxProfile(profile_directory)# 启动浏览器配置driver = webdriver.Firefox(profile)
2.2 元素定位
对象的定位应该是⾃动化测试的核⼼,要想操作⼀个对象,⾸先应该识别这个对象。⼀个对象就是⼀个⼈⼀样,他会有各种的特征(属性),如⽐我们可以通过⼀个⼈的⾝份证
号,姓名,或者他住在哪个街道、楼层、门牌到这个⼈。那么⼀个对象也有类似的属性,我们可以通过这个属性到这对象。
webdriver 提供了⼀系列的对象定位⽅法,常⽤的有以下⼏种:
id定位:find_element_by_id()name定位:find_element_by_name()class定位:find_element_by_class_name()link定位:find_element_by_link_text()partial link定位:
find_element_by_partial_link_text()tag定位:find_element_by_tag_name()xpath定位:find_element_by_xpath()css定位:find_element_by_css_selector()#coding=utf-8from
selenium import webdriverbrowser=webdriver.Firefox()("URL")>####百度输⼊框的定位⽅式>>#通过id⽅式定位
browser.find_element_by_id("kw").send_keys("selenium")#通过name⽅式定位browser.find_element_by_name("wd").send_keys("selenium")#通过tag name⽅式定位
browser.find_element_by_tag_name("input").send_keys("selenium")#通过class name⽅式定位browser.find_element_by_class_name("s_ipt").send_keys("selenium")#通过
CSS⽅式定位browser.find_element_by_css_selector("#kw").send_keys("selenium")#通过xpath⽅式定位
browser.find_element_by_xpath("//input[@id='kw']").send_keys("selenium")>>>>>>>>####browser.find_element_by_id("su").click()time.sleep(3)browser.quit( 2.2.1 class含有空格时解决⽅法:
在实际进⾏元素定位时,经常发现class name是有多个class组合的复合类,中间以空格隔开。如果直接进⾏定位会出现报错,可以通过以下⽅式处理:
class属性唯⼀但是有空格,选择空格两边唯⼀的那⼀个若空格隔开的class不唯⼀可以通过索引进⾏定位self.driver.find_elements_by_class_name('table-dragColumn')
[0].click()通过css⽅法进⾏定位(空格以‘.’代替)#前⾯加(.)空格地⽅⽤点(.)来代替self.driver.find_element_by_css_selector('.dtb-style-1.table-dragColumns').click()#包含整
个类self.driver.find_element_by_css_selector('class="dtb-style-1 table-dragColumns').click()
参考代码:
# coding:utf-8from selenium import webdriverdriver = webdriver.Firefox()("URL")driver.implicitly_wait(20)driver.switch_to.frame("x-URS-iframe")# ⽅法⼀:取单个class
属性driver.find_element_by_class_name("dlemail").send_keys("yoyo")driver.find_element_by_class_name("dlpwd").send_keys("12333")# ⽅法⼆:定位⼀组取下标定位(乃下
策)driver.find_elements_by_class_name("j-inputtext")[0].send_keys("yoyo")driver.find_elements_by_class_name("j-inputtext")[1].send_keys("12333")# ⽅法三:css定位
driver.find_element_by_css_selector(".j-inputtext.dlemail").send_keys("yoyo")driver.find_element_by_c
ss_selector(".j-inputtext.dlpwd").send_keys("123")# ⽅法四:取单个
class属性也是可以的driver.find_element_by_css_selector(".dlemail").send_keys("yoyo")driver.find_element_by_css_selector(".dlpwd").send_keys("123")# ⽅法五:直接包含空
格的CSS属性定位⼤法driver.find_element_by_css_selector("[class='j-inputtext dlemail']").send_keys("yoyo")
2.3 selenium三种等待⽅式
有时候为了保证脚本运⾏的稳定性,需要脚本中添加等待时间。
2.3.1 强制等待
第⼀种也是最简单粗暴的⼀种办法就是强制等待sleep(xx),需要引⼊“time”模块,这种叫强制等待,不管你浏览器是否加载完了,程序都得等待3秒,3秒⼀到,继续执⾏下⾯的
代码,作为调试很有⽤,有时候也可以在代码⾥这样等待,不过不建议总⽤这种等待⽅式,太死板,严重影响程序执⾏速度。
# -*- coding: utf-8 -*-from selenium import webdriverimport timedriver = webdriver.Firefox()('URL')time.sleep(3) # 强制等待3秒再执⾏下⼀步
print(driver.current_url)driver.quit()
2.3.2 隐性等待
第⼆种办法叫隐性等待,通过添加 implicitly_wait() ⽅法就可以⽅便的实现智能等待;implicitly_wait(30) 的⽤法应该⽐ time.sleep() 更智能,后者只能选择⼀个固定的时间的等待,前者可以在⼀个时间范围内智能的等待。
# -*- coding: utf-8 -*-from selenium import webdriverdriver = webdriver.Firefox()driver.implicitly_wait(30) # 隐性等待,最长等30秒
<('URL')print(driver.current_url)driver.quit()
隐形等待是设置了⼀个最长等待时间,如果在规定时间内⽹页加载完成,则执⾏下⼀步,否则⼀直等到时间截⽌,然后执⾏下⼀步。注意这⾥有⼀个弊端,那就是程序会⼀直等待整个页⾯加载完成,也就是⼀般情况下你看到浏览器标签栏那个⼩圈不再转,才会执⾏下⼀步,但有时候页⾯想要的元素早就在加载完成了,但是因为个别js之类的东西特别慢,我仍得等到页⾯全部完成才能执⾏下⼀步,我想等我要
的元素出来之后就下⼀步怎么办?有办法,这就要看selenium提供的另⼀种等待⽅式——显性等待wait了。需要特别说明的是:隐性等待对整个driver的周期都起作⽤,所以只要设置⼀次即可,我曾看到有⼈把隐性等待当成了sleep在⽤,⾛哪⼉都来⼀下…
2.3.3 显性等待
第三种办法就是显性等待,WebDriverWait,配合该类的until()和until_not()⽅法,就能够根据判断条件⽽进⾏灵活地等待了。它主要的意思就是:程序每隔xx秒看⼀眼,如果条件成⽴了,则执⾏下⼀步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。
wait模块的WebDriverWait类是显性等待类,先看下它有哪些参数与⽅法:
selenium.webdriver.support.wait.WebDriverWait(类)
init
driver: 传⼊WebDriver实例,即我们上例中的drivertimeout: 超时时间,等待的最长时间(同时要考虑隐性等待时间)poll_frequency: 调⽤until或until_not中的⽅法的间隔时间,默认是0.5秒ignored_exceptions: 忽略的异常,如果在调⽤until或until_not的过程中抛出这个元组中的异常,则不中断代码,继续等待,如果抛出的是这个元组外的异常,则中断代码,抛出异常。默认只有NoSuchEleme
ntException。
until
method: 在等待期间,每隔⼀段时间(__init__中的poll_frequency)调⽤这个传⼊的⽅法,直到返回值不是Falsemessage: 如果超时,抛出TimeoutException,将message传⼊异常
until_not
与until相反,until是当某元素出现或什么条件成⽴则继续执⾏,until_not是当某元素消失或什么条件不成⽴则继续执⾏,参数也相同,不再赘述。
看了以上内容基本上很清楚了,调⽤⽅法如下:
WebDriverWait(driver, 超时时长, 调⽤频率, 忽略异常).until(可执⾏⽅法, 超时时返回的信息)
这⾥需要特别注意的是until或until_not中的可执⾏⽅法method参数,很多⼈传⼊了WebElement对象,如下:
WebDriverWait(driver, 10).until(driver.find_element_by_id('kw')) # 错误
这是错误的⽤法,这⾥的参数⼀定要是可以调⽤的,即这个对象⼀定有 call() ⽅法,否则会抛出异常:
TypeError: 'xxx' object is not callable
在这⾥,你可以⽤selenium提供的 expected_conditions 模块中的各种条件,也可以⽤WebElement的 is_displayed() 、is_enabled()、**is_selected() **⽅法,或者⽤⾃⼰封装的⽅法都可以。
#coding=utf-8from selenium import webdriverfrom selenium.webdrivermon.by import Byfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.wait import WebDriverWaitbase_url = "URL"driver = webdriver.Firefox()driver.implicitly_wait(5)'''隐式等待和显⽰等待都存在时,超时时间取⼆者中较⼤的'''locator = (By.ID,'kw')(base_url)WebDriverWait(driver,10).until(EC.title_is(u"百度⼀下,你就知道"))'''判断title,返回布尔
值'''WebDriverWait(driver,10).until(EC.title_contains(u"百度⼀下"))'''判断title,返回布尔值'''WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'kw')))'''判断某个元素是否被加到了dom树⾥,并不代表该元素⼀定可见,如果定位到就返回WebElement'''WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.ID,'su')))'''判断某个元素是否被添加到了dom⾥并且可见,可见代表元素可显⽰且宽和⾼都⼤于
0'''WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(by=By.ID,value='kw')))'''判断元素是否可见,如果可见就返回这个元
素'''WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'.mnav')))'''判断是否⾄少有1个元素存在于dom树中,如果定位到就返回列
表'''WebDriverWait(driver,10).until(EC.visibility_of_any_elements_located((By.CSS_SELECTOR,'.mnav')))'''判断是否⾄少有⼀个元素在页⾯中可见,如果定位到就返回列
表'''WebDriverWait(driver,10)._to_be_present_in_element((By.XPATH,"//*[@id='u1']/a[8]"),u'设置'))'''判断指定的元素中是否包含了预期的字符串,返回布尔
值'''WebDriverWait(driver,10)._to_be_present_in_element_value((By.CSS_SELECTOR,'#su'),u'百度⼀下'))'''判断指定元素的属性值中是否包含了预期的字符串,返回布尔值'''#WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it(locator))'''判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False'''#注意这⾥并没有⼀个frame可以切换进去
WebDriverWait(driver,10).until(EC.invisibility_of_element_located((By.CSS_SELECTOR,'#swfEveryCookieWrap')))'''判
断某个元素在是否存在于dom或不可见,如果可见返回False,不可见返回这个元素'''#注意#swfEveryCookieWrap在此页⾯中是⼀个隐藏的元素WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*
[@id='u1']/a[8]"))).click()'''判断某个元素中是否可见并且是enable的,代表可点击'''driver.find_element_by_xpath("//*
[@id='wrapper']/div[6]/a[1]").click()#WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*
[@id='wrapper']/div[6]/a[1]"))).click()#WebDriverWait(driver,10).until(EC.staleness_of(driver.find_element(By.ID,'su')))'''等待某个元素从dom树中移除'''#这⾥没有到合适的例⼦WebDriverWait(driver,10).until(EC.element_to_be_selected(driver.find_element(By.XPATH,"//*[@id='nr']/option[1]")))'''判断某个元素是否被选中了,⼀般⽤在下拉列
表'''WebDriverWait(driver,10).until(EC.element_selection_state_to_be(driver.find_element(By.XPATH,"//*[@id='nr']/option[1]"),True))'''判断某个元素的选中状态是否符合预
期'''WebDriverWait(driver,10).until(EC.element_located_selection_state_to_be((By.XPATH,"//*[@id='nr']/option[1]"),True))'''判断某个元素的选中状态是否符合预
期'''driver.find_element_by_xpath(".//*[@id='gxszButton']/a[1]").click()instance = WebDriverWait(driver,10).until(EC.alert_is_present())'''判断页⾯上是否存在alert,如果有就切换到alert并返回alert的内容'''instance.accept()driver.close()
2.4 浏览器操作
2.4.1 浏览器最⼤化、最⼩化
将浏览器最⼤化显⽰
browser.maximize_window()
将浏览器最⼩化显⽰
browser.minimize_window()
2.4.2 浏览器设置窗⼝⼤⼩
设置浏览器宽480、⾼800显⽰
browser.set_window_size(480, 800)
2.4.3 浏览器前进后退
前进
browser.forword()
后退
browser.back()
2.5 操作测试对象
⼀般来说,webdriver 中⽐较常⽤的操作对象的⽅法有下⾯⼏个:
click——点击对象send_keys——在对象上模拟按键输⼊clear——清除对象的内容,如果可以的话submit——提交对象的内容,如果可以的话text——⽤于获取元素的⽂本信
息2.6 键盘事件
要想调⽤键盘按键操作需要引⼊ keys 包:from selenium.webdrivermon.keys import Keys通过 send_keys()调⽤按键:send_keys(Keys.TAB) #
TABsend_keys(Keys.ENTER) # 回车
参考代码:
#coding=utf-8 from selenium import webdriver from selenium.webdrivermon.keys import Keys #需要引⼊ keys 包import os,timedriver = webdriver.Firefox()
<("passport.kuaibo/login/?referrer=http%3A%2F%2Fwebcloud .kuaibo%2F")time.sleep(3) driver.maximize_window() # 浏览器全屏显⽰
driver.find_element_by_id("user_name").clear() driver.find_element_by_id("user_name").send_keys("fnngj")#tab 的定位相相于清除了密码框的默认提⽰信息,等同上⾯的clear() driver.find_element_by_id("user_name").send_keys(Keys.TAB) time.sleep(3) driver.find_element_by_id("user_pwd").send_keys("123456")#通过定位密码框,enter(回车)来代替登陆按钮driver.find_element_by_id("user_pwd").send_keys(Keys.ENTER)#也可定位登陆按钮,通过 enter(回车)代替 click()
driver.find_element_by_id("login").send_keys(Keys.ENTER) time.sleep(3)driver.quit()
键盘组合键的⽤法:
#ctrl+a 全选输⼊框内容 driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
#ctrl+x 剪切输⼊框内容 driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
2.7 ⿏标事件
⿏标事件⼀般包括⿏标右键、双击、拖动、移动⿏标到某个元素上等等。需要引⼊ActionChains类。引⼊⽅法:from selenium.webdrivermon.action_chains import ActionChains
ActionChains 常⽤⽅法:perform() 执⾏所有ActionChains 中存储的⾏为;context_click() 右击;double_click() 双击;drag_and_drop() 拖动;move_to_element() ⿏标悬停。⿏标双击⽰例:
#定位到要双击的元素qqq =driver.find_element_by_xpath("xxx") #对定位到的元素执⾏⿏标双击操作 ActionChains(driver).double_click(qqq).perform()
⿏标拖放⽰例:
#定位元素的原位置 element = driver.find_element_by_name("source") #定位元素要移动到的⽬标位置 target = driver.find_element_by_name("target")#执⾏元素的移动操作ActionChains(driver).drag_and_drop(element, target).perform()
2.8 多层框架/层级定位
定位元素过程中经常会遇到不到元素的问题,出现该问题⼀般都是以下因素导致:
元素定位⽅法不对页⾯存在iframe或内嵌窗⼝页⾯超时webdriver 提供了⼀个 switch_to_frame ⽅法,可以很轻松的来解决这个问题。⽤法:
#先到到 ifrome1(id = f1)browser.switch_to_frame("f1")
同样的,如果是内嵌窗⼝:browser.switch_to_window("f1")
2.9 Expected Conditions解析
Expected Conditions的使⽤场景有2种:
直接在断⾔中使⽤与WebDriverWait配合使⽤,动态等待页⾯上元素出现或者消失相关⽅法:
title_is: 判断当前页⾯的title是否精确等于预期title_contains:判断当前页⾯的title是否包含预期字符串presence_of_element_located:判断某个元素是否被加到了dom树⾥,并不代表该元素⼀定可见visibility_of_element_located:判断某个元素是否可见.可见代表元素⾮隐藏,并且元素的宽和⾼都不等
于0visibility_of:跟上⾯的⽅法做⼀样的事情,只是上⾯的⽅法要传⼊locator,这个⽅法直接传定位到的element就好了presence_of_all_elements_located:判断是否⾄少有1个元素存在于dom树中。举个例⼦,如果页⾯上有n 个元素的class都是'column-md-3',那么只要有1个元素存在,这个⽅法就返回Truetext_to_be_present_in_element:判断某个元素中的text是否包含了预期的字符
串text_to_be_present_in_element_value:判断某个元素中的value属性是否包含了预期的字符串frame_to_be_available_and_switch_to_it:判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回Falseinvisibility_of_element_located:判断某个元素中是否不存在于dom树或不可见element_to_be_clickable:判断某个元素中是否可见并且是enable的,这样的话才叫clickablestaleness_of:等某个元素从dom树中移除,注意,这个⽅法也是返回True或Falseelement_to_be_selected:判断某个元素是否被选中了,⼀般⽤在下拉列表element_selection_state_to_be:判断某个元素的选中状态是否符合预期element_located_selection_state_to_be:跟上⾯的⽅法作⽤⼀样,只是上⾯的⽅法传⼊定位到的element,⽽这个⽅法传⼊locatoralert_is_present:判断页⾯上是否存在alert,这是个⽼问题,很多同学会问到⽰例:判断title:title_is()、
title_contains()
⾸先导⼊expected_conditions模块由于这个模块名称⽐较长,所以为了后续的调⽤⽅便,重新命名为EC了(有点像数据库⾥⾯多表查询时候重命名)打开博客⾸页后判断title,返回结果是True或False# coding:utf-8from selenium import webdriverfrom selenium.webdriver.support import expected_conditions as ECdriver =
webdriver.Firefox()("URL")# 判断title完全等于title = EC.title_is(u'冰封')print title(driver)# 判断title包含title1 = EC.title_contains(u'冰封')print title1(driver)# 另外⼀种写法r1 = EC.title_is(u'冰封')(driver)r2 = EC.title_contains(u'冰封')(driver)print r1print r2
三、Selenium速查表
3.1 Python Webdriver Exception速查表
webdriver在使⽤过程中可能会出现各种异常,我们需要了解该异常并知道如何进⾏异常处理。
异常描述
WebDriverException 所有webdriver异常的基类,当有异常且不属于下列异常时抛出 InvalidSwitchToTargetException 下⾯两个异常的⽗类,当要switch的⽬标不存在时抛出NoSuchFrameException 当你想要⽤switch_to.frame()切⼊某个不存在的frame时抛出 NoSuchWindowE
xception 当你想要⽤switch_to.window()切⼊某个不存在的window时抛出NoSuchElementException 元素不存在,⼀般由find_element与find_elements抛出 NoSuchAttributeException ⼀般你获取不存在的元素属性时抛出,要注意有些属性在不同浏览器⾥是有不同的属性名的 StaleElementReferenceException 指定的元素过时了,不在现在的DOM树⾥了,可能是被删除了或者是页⾯或iframe刷新了UnexpectedAlertPresentException 出现了意料之外的alert,阻碍了指令的执⾏时抛出 NoAlertPresentException 你想要获取alert,但实际没有alert出现时抛出InvalidElementStateException 下⾯两个异常的⽗类,当元素状态不能进⾏想要的操作时抛出 ElementNotVisibleException 元素存在,但是不可见,不可以与之交互ElementNotSelectableException 当你想要选择⼀个不可被选择的元素时抛出 InvalidSelectorException ⼀般当你xpath语法错误的时候抛出这个错InvalidCookieDomainException 当你想要在⾮当前url的域⾥添加cookie时抛出 UnableToSetCookieException 当driver⽆法添加⼀个cookie时抛出 TimeoutException 当⼀个指令在⾜够的时间内没有完成时抛出 MoveTargetOutOfBoundsException actions的move操作时抛出,将⽬标移动出了window之外 UnexpectedTagNameException 获取到的元素标签不符合要求时抛出,⽐如实例化Select,你传⼊了⾮select标签的元素时 ImeNotAvailableException 输⼊法不⽀持的时候抛出,这⾥两个异常不常见,ime引擎据说是仅⽤于linux下对中⽂/⽇⽂⽀持的时候 ImeActivationFailedException 激活输⼊法失败时抛出 ErrorInResponseException 不常见,server端出错时可能会抛RemoteDriverServerException 不常见,好像是在某些情况下驱动启动浏览器失败的时候会报这个错
3.2 Xpath&Css定位⽅法速查表
描述 Xpath
Css
直接⼦元素 //div/a div > a
⼦元素或后代元素 //div//a div a
以id定位 //div[@id='idValue']//a div#idValue a
以class定位 //div[@class='classValue']//a div.classValue a
同级弟弟元素 //ul/li[@class='first']/following- ul>li.first + li 属性 //form/input[@name='username'] form input[name='username'] 多个属性 //input[@name='continue' and input[name='continue'][type='button
第4个⼦元素 //ul[@id='list']/li[4] ul#list li:nth-child(4)
第1个⼦元素 //ul[@id='list']/li[1] ul#list li:first-childxpath语法 python
最后1个⼦元素 //ul[@id='list']/li[last()] ul#list li:last-child
属性包含某字段 //div[contains(@title,'Title')] div[title*="Title"]
属性以某字段开头 //input[starts-with(@name,'user')] input[name^="user"]
属性以某字段结尾 //input[ends-with(@name,'name')] input[name$="name"]
text中包含某字段 //div[contains(text(), 'text')]
⽆法定位元素有某属性 //div[@title] div[title]
⽗节点 //div/.. ⽆法定位
参考于:baijiahao.baidu/s?id=1650828444523528232&wfr=spider&for=pc
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
beautifulsoup lxml 语法
« 上一篇
Python爬虫框架Scrapy实例(二)
下一篇 »
发表评论