
刚接触 Python 的 Selenium 不久,就想做个小玩具练练手。我写的玩具是登录淘宝,签到领取淘金币。
现在遇到的问题是,从「店铺签到」入口进入到各家店铺( eg. URL https://shop136560499.taobao.com/ugo.htm?spm=a217e.7759359.15285.2.pa4eVE&signin=true )后,想模拟点击「立即签到」,但是 click() 事件无效。
相关代码如下:
# 店铺签到 def shop_check_in(self): urls = [ 'https://nongfutechan.taobao.com/ugo.htm?spm=a217e.7759359.15285.1.4xE9Il&signin=true#ugo-jinbi', 'https://shop136560499.taobao.com/ugo.htm?spm=a217e.7759359.15285.2.muhVBy&signin=true#ugo-jinbi', 'https://shop33473134.taobao.com/ugo.htm?spm=a217e.7759359.15285.3.yW2N4E&signin=true#ugo-jinbi' ] for url in urls: self.driver.get(url) time.sleep(5) print("page_source\t%s" % self.driver.page_source) self.driver.find_element_by_xpath('//a[@href="#" and @class="now-take J_NowSignIn" and text()="立即签到"]').click() 我尝试过的方法有:
实际测试过程中发现,只有极少数情形,模拟点击「立即签到」成功;其它大多数情形下, click() 事件都是无效的。
目前没有想到别的方法了……
一般而言, Selenium click() 无效,可能会是什么原因呢?
请大家帮忙分析下原因,指点一二?
谢谢大家。
2 lilydjwg 2016 年 11 月 18 日 可能是时序方面的原因?你点早了? |
3 Nostalgia OP @lilydjwg 哇哦,仙子在线哟。 应该不是时间的问题,我 time.sleep() 设置了延时,确保页面已经加载完成了。 另外,用 ActionChains.context_click() 测试,发现鼠标右键确实放在了相应的 element 上。 |
4 lilydjwg 2016 年 11 月 18 日 我不会用 Selenium ……在页面加载完之后,选择器没错。你把你程序执行时的元素打印出来看看获取到了没?请求发出去了没? 不过你何不通过抓包来看怎么发请求呢? |
5 misaka19000 2016 年 11 月 18 日 头像太可怕了 |
6 Nostalgia OP @lilydjwg 哈哈,以为你啥都会呢。:-) 不通过发 HTTP 请求的方式是因为淘宝这类网站登陆太复杂,而且很多操作涉及到很多 JS 代码,光靠 urllib/requests 之类的不行。 还是很谢谢仙子,笑口常开,常喜乐。 |
7 Nostalgia OP @misaka19000 瞎说什么大实话。 |
8 holajamc 2016 年 11 月 18 日 driver.implicitly_wait() 或者 WebDriverWait(driver, 10).until() 第一个是隐式等待;第二个是显式等待,可以等待某一个元素加载完成,推荐去虫师的博客翻翻 |
11 holajamc 2016 年 11 月 18 日 @Nostalgia //*[@id="ugo-jinbi"]/div/div[2]/div[1]/div/div[2]/p[1]/a #ugo-jinbi > div > div.act-module-bd > div.act-jinbi-take > div > div.J_SignInCon > p.today-can-do > a 用 Chrome 复制出来的~试试换一下 xpath 或者用 css 选择器~ |
14 unfurl 2016 年 11 月 18 日 相信不是楼主 selenium 使用的问题 |
15 unfurl 2016 年 11 月 18 日 我不记得在哪个场合听说过,淘宝的前端能精确识别非人类的操作, so.... |
16 bbxiong 2016 年 11 月 19 日 你试试点击浏览器式浏览器前台,发现 click 有些地方览器必须前台才能用...... |
19 Nostalgia OP |