鱼C论坛

 找回密码
 立即注册
查看: 3255|回复: 4

[技术交流] Do interesting things with Python —— 微信自动喊话【selenium篇2】

[复制链接]
发表于 2016-7-13 18:37:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
f430c525ee30bb18bb59c66194233aec27c9a7ec1d00d-JM6CyV_fw658.png


接上回,
我们已经可以自如的切换多标签,
找到一些有唯一标识符的元素,
并实现了自动搜索这个功能。


那我们现在深入了解一下。

核心部分。

是的,我们想要模拟用户操作,
要先找到我们要操作的元素。

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}")>
同理。


评分

参与人数 1荣誉 +8 鱼币 +8 贡献 +8 收起 理由
小甲鱼 + 8 + 8 + 8 有趣的事情即将到来~

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-13 18:43:23 | 显示全部楼层
有趣的事情即将到来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-16 11:45:21 | 显示全部楼层
我能说弄不清这些帖子的阅读顺序吗~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-16 13:46:21 | 显示全部楼层
~风介~ 发表于 2016-7-16 11:45
我能说弄不清这些帖子的阅读顺序吗~

selenium是番外。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-16 13:55:28 | 显示全部楼层
wei_Y 发表于 2016-7-16 13:46
selenium是番外。。

原来如此!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 14:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表