接上回,
我们已经可以自如的切换多标签,
找到一些有唯一标识符的元素,
并实现了自动搜索这个功能。
那我们现在深入了解一下。
核心部分。
是的,我们想要模拟用户操作,
要先找到我们要操作的元素。
selenium提供了很多定位元素的方法。
常用的有以下几种。
• id
• name
• class name
• tag name
• css selector
• link text
• partial link text
如果你了解过html,
你就会知道,如果有id那可以直接用id来获取,
id在html中一般是唯一的。
name一般也是这样。
class name一般会获取出一群。
tag name也会获取出一群,除非这个页面只有一个这样的标签。
css selector 通过css选择器来获取元素。
css selector这个比较万能,
css本身就需要定位元素,所以一般通过css selector是可以准确获取出元素滴。
那我们就来获取一下鱼C的搜索框。
<input placeholder="请输入搜索内容" class=" xg1" name="srchtxt" id="scbar_txt" value="请输入搜索内容" autocomplete="off" x-webkit-speech="" speech="" type="text">
通过id获取。>>> browser.find_element_by_id('scbar_txt')
<selenium.webdriver.remote.webelement.WebElement (session="7b6bea86-1f27-410b-8d9e-98994d999802", element="{6eda0248-3f58-44ee-bfbd-fa2702f71056}")>
通过name获取。>>> browser.find_element_by_name('srchtxt')
<selenium.webdriver.remote.webelement.WebElement (session="7b6bea86-1f27-410b-8d9e-98994d999802", element="{6eda0248-3f58-44ee-bfbd-fa2702f71056}")>
通过class name获取。(注意鱼C的这个class name 前面是有空格的。)>>> browser.find_element_by_class_name(' xg1')
<selenium.webdriver.remote.webelement.WebElement (session="7b6bea86-1f27-410b-8d9e-98994d999802", element="{cb2414e6-7c4d-43ec-8056-0b90dce6e223}")>
但是你会发现,这里的element发生了变化,这是为什么呢。
前面说到,class name一般会获取到一群,我们肯定是获取到其他元素上了。
那怎么办?
selenium提供了方法。>>> browser.find_elements_by_class_name(' xg1')
[<selenium.webdriver.remote.webelement.WebElement (session="7b6bea86-1f27-410b-8d9e-98994d999802", element="{cb2414e6-7c4d-43ec-8056-0b90dce6e223}")>, <selenium.webdriver.remote.webelement.WebElement (session="7b6bea86-1f27-410b-8d9e-98994d999802", element="{48d8ee69-1ec5-4ab2-b914-897a086c119e}")>, <selenium.webdriver.remote.webelement.WebElement (session="7b6bea86-1f27-410b-8d9e-98994d999802", element="{6eda0248-3f58-44ee-bfbd-fa2702f71056}")>]
对于有可能获取到多个元素的方法,selenium提供了elements方法来获取到所有的元素。
你瞧,最后一个就是我们的搜索框了。
那么自然,使用tag name应该也不会一步找到输入框。
那么直接用s方法。>>> browser.find_elements_by_tag_name('input')
[<selenium.webdriver.remote.webelement.WebElement (session="7b6bea86-1f27-410b-8d9e-98994d999802", element="{75cff74e-f485-4aef-8040-c51f2e3329bf}")>, <selenium.webdriver.remote.webelement.WebElement (session="7b6bea86-1f27-410b-8d9e-98994d999802", element="{0c40b04b-67c1-4d78-805e-2021ca292dc2}")>, <selenium.webdriver.remote.webelement.WebElement (session="7b6bea86-1f27-410b-8d9e-98994d999802", element="{772cfe24-f3c9-4b79-9ecf-5185f1384872}")>, <selenium.webdriver.remote.webelement.WebElement (session="7b6bea86-1f27-410b-8d9e-98994d999802", element="{66ea57d9-b5ee-418b-86a3-f4cb4ef41d18}")>, <selenium.webdriver.remote.webelement.WebElement (session="7b6bea86-1f27-410b-8d9e-98994d999802", element="{19548010-4d6c-4313-af76-e65cc1a05a19}")>, <selenium.webdriver.remote.webelement.WebElement (session="7b6bea86-1f27-410b-8d9e-98994d999802", element="{6eda0248-3f58-44ee-bfbd-fa2702f71056}")>]
因为有个表单嘛,那么最后一个就是搜索框了。
!!!
重量级方法。>>> browser.find_element_by_css_selector('input[class=" xg1"]')
<selenium.webdriver.remote.webelement.WebElement (session="7b6bea86-1f27-410b-8d9e-98994d999802", element="{6eda0248-3f58-44ee-bfbd-fa2702f71056}")>
>>> browser.find_element_by_css_selector('input[class=" xg1"][name="srchtxt"]')
<selenium.webdriver.remote.webelement.WebElement (session="7b6bea86-1f27-410b-8d9e-98994d999802", element="{6eda0248-3f58-44ee-bfbd-fa2702f71056}")>
总之使用这个方法基本上代替上面任何一种方法。
有时候我们想通过文字来获取一些元素。
比如这个。<a href="forum-173-1.html">Python交流</a>
一般那就上css selector,通过href获取了。(这个真不会怎么用css定位文字。)
不过这种反人类的方法还是不被大家所喜欢的(好吧,至少我不喜欢)。
selenium提供两种方法。>>> browser.find_element_by_link_text('Python交流')
<selenium.webdriver.remote.webelement.WebElement (session="7b6bea86-1f27-410b-8d9e-98994d999802", element="{e145e6c8-2faf-4186-92bd-d845c4c316f6}")>
需要准确完整的内容,否则就给你报错。
当然也有可能是S方法,这里就是得用S方法。
第二种就是局部的内容。>>> browser.find_element_by_partial_link_text('Python')
<selenium.webdriver.remote.webelement.WebElement (session="7b6bea86-1f27-410b-8d9e-98994d999802", element="{e145e6c8-2faf-4186-92bd-d845c4c316f6}")>
同理。