Selenium WebDriver 只是 Python 的一个第三方框架, 和 Djangoweb 开发框架属于一个性质。
webdriver 提供了八种元素定位方法,python语言中也有对应的方法,
序号 | webdriver元素定位方法 | python中对应方法 |
1 | id | find_element_by_id() |
2 | name | find_element_by_name() |
3 | class name | find_element_by_class_name() |
4 | tag name | find_element_by_tag_name() |
5 | link text | find_element_by_link_text() |
6 | partial link text | find_element_by_partial_link_text() |
7 | xpath | find_element_by_xpath() |
8 | css selector | find_element_by_css_selector() |
其中,前面两个方法的唯一性很高,
找元素,确保其唯一性,否则报错,可以通过搜索来确定,比如下面:输入kw,可以看有多少个id等于kw的 <html><head><body><script><div id="wrapper" style="display: block;"><div id="debug" style="display:block;position:.."><script><div id="head" class="s_down"><div class="head_wrapper"><div class="s_form"><div class="s_form_wrapper"><div id="lg"><a id="result_logo" onmousedown="return .." href="/"><form id="form" class="fm" action="/s" name="f"><input type="hidden" value="utf-8" name="ie"><input type="hidden" value="8" name="f" id="kw"><input type="hidden" value="1" name="rsv_bp" ><input type="hidden" value="1" name="rsv_idx"><input type="hidden" value="" name="ch" class="s_ipt"><input type="hidden" value="02.." name="tn"><input type="hidden" value="" name="bar"><span class="bg s_ipt_wr"><input id="kw" class="s_ipt" autocomplete="off" maxlength="100" value="" name="wd"> <!--输入框--></span><span class="bg s_btn_wr"><input id="su" class="bg s_btn" type="submit" value="百度一下"> <!--百度按钮--></span>输入框<input id="kw" class="s_ipt" name="wd" value="" maxlength="255" autocomplete="off"> ’百度一下‘按钮<input id="su" class="bg s_btn" value="百度一下" type="submit"> #iddr.find_element_by_id("kw")dr.find_element_by_id("su") #namedr.find_element_by_name("wd") #clas name,其实就是classdr.find_element_by_class_name("s_ipt")dr.find_element_by_class_name("bg s_btn") #tag name,标签,用得很少,除非是像第二种定位一组元素dr.find_element_by_tag_name("input")dr.find_elements_by_tag_name("input")[7].send_keys("ssss") # 定位一组元素,第8个 <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a><a class="mnav" href="http://www.hao123.com" name="tj_trhao123">hao123</a<a class="mnav" href="http://map.baidu.com" name="tj_trmap">地图</a><a class="mnav" href="http://v.baidu.com" name="tj_trvideo">视频</a><a class="mnav" href="http://tieba.baidu.com" name="tj_trtieba">一个很长很长的文本</a> #link textdr.find_element_by_link_text("新闻").click()dr.find_element_by_link_text("一个很长很长的文本").click()dr.find_element_by_partial_link_text("文本") # 对上面的补充,部分文字链接
#xpath dr.find_element_by_xpath() # id 不指定标签 dr.find_element_by_xpath("//*[@id='kw']") # //表示某个目录下,/表示根目录,*表示标签名,可以指定,也可以不指定,此处不指定。整体含义:某个路径下的某个标签下有一个id属性等于kw # id 指定标签,可以缩小范围 dr.find_element_by_xpath('//input[@id="kw"]') # name dr.find_element_by_xpath('//input[@name="wd"]') # class dr.find_element_by_xpath('//input[@class="s_ipt"]') # 具有的其余属性,比如maxlength dr.find_element_by_xpath('//input[@maxlength="100"]') 所以,所有属性都可以,只要是唯一的。 如果没有可用的属性,则找上级 # 上级(父级)标签span dr.find_element_by_xpath('//span[@class="bg s_ipt_wr"]/input') # 此处一个/表示父子关系,下一级 dr.find_element_by_xpath('//span[@class="bg s_ipt_wr"]/input[@class="s_ipt"]') # 父级属性加子级属性,更精确 # 上上级(爷爷级)标签form dr.find_element_by_xpath("//form[@id='form']/span[2]/input") # 第二个span,从1开始的,百度按钮 firebug复制路径 xpath路径/html/body/div/div[1]/div/div[1]/div/form/span[2]/input # 里面的数字是从1开始的,也可以通过收起来、展开来确定是第几个标签 最简xpath路径//*[@id="su"] css路径html body div#wrapper div#head div.head_wrapper div.s_form div.s_form_wrapper form#form.fm span.bg.s_btn_wr input#su.bg.s_btn # 绝对路径,一定可以找到某个元素,但是页面发生一点变化,就失效dr.find_element_by_xpath("/html/body/div[7]/div/form/span[2]/input").click() # and ordr.find_element_by_xpath("//input[@id='kw' and @class='s_ipt' and @autocomplete='off']") # cssdr.find_element_by_css_selector() # classdr.find_element_by_css_selector(".s_ipt") # class,点号后面表示是class的值 # iddr.find_element_by_css_selector("#kw") # id # name,值未加引号dr.find_element_by_css_selector("[name=wd]") # name # name,值加引号dr.find_element_by_css_selector("[name='wd']") # name # 其余属性dr.find_element_by_css_selector("[maxlength='100']") # 上级dr.find_element_by_css_selector("span.bg s_ipt_wr > input") # 上级,子标签标识classdr.find_element_by_css_selector("span.bg s_ipt_wr > input.s_ipt") # 上级,子标签标识iddr.find_element_by_css_selector("span.bg s_ipt_wr > input#kw") # #表示id # 上上级dr.find_element_by_css_selector("form#form >span.bg s_ipt_wr > input#kw")