用Python 3 + Selenium 3实现汉堡王客户调查的自动填写,可以用来作为 python selenium的入门学习实现脚本,列举了几个比较不太好弄的知识点。

上代码:

  1. from selenium import webdriver
  2. from selenium.webdriver.support.ui import WebDriverWait
  3. from selenium.webdriver.support import expected_conditions as EC
  4. from selenium.webdriver.common.by import By
  5. import unittest
  6. from selenium.webdriver.common.keys import Keys
  7. import time
  8.  
  9. class TellBK(unittest.TestCase):
  10. def setUp(self) -> None:
  11. self.driver = webdriver.Firefox()
  12. self.driver.implicitly_wait(30)
  13.  
  14. def test_fillFeedBack(self):
  15. driver = self.driver
  16. driver.maximize_window()
  17. driver.get('https://tellburgerking.com.cn')
  18. time.sleep(10)
  19.  
  20. # Page 1 - Welcome
  21. # 点击继续
  22. element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//input[@id="NextButton"]')))
  23. element.click()
  24.  
  25. # Page 2 - Fill the codes and continue
  26. # 填写调查代码, FeedbackCode.txt保存调查代码,3个一组,空格分开
  27. codefile = open('FeedbackCode.txt', 'r')
  28. feedbackcode = codefile.read().split(" ")
  29. codefile.close()
  30. for i in range(len(feedbackcode)):
  31. driver.find_element_by_xpath('//input[@id="CN{}"]'.format(i+1)).send_keys(feedbackcode[i])
  32. # 点击开始
  33. driver.find_element_by_xpath('//input[@id="NextButton"]').submit()
  34.  
  35. # Page 3 - Page 12
  36. radiovaluelist = [('simpleInput rblv', 2), ('simpleInput rblv', 2), ('simpleInput rblv', 1),
  37. ('simpleInput rbl', 5), ('simpleInput rbl', 5), ('simpleInput rbl', 5),
  38. ('simpleInput rbl', 5), ('simpleInput rbl', 9), ('simpleInput rbl', 2),
  39. ('simpleInput rbl', 5)]
  40. for radiovalue in radiovaluelist:
  41. self.selectRadiosSubmit(radiovalue)
  42.  
  43. # Page 13 - Say something
  44.     with open('HappyReason.txt') as filereason:
  45. reasontext = filereason.read()
  46. driver.find_element_by_xpath('//textarea[@id="S000122"]').send_keys(reasontext)
  47. # Next
  48. driver.find_element_by_xpath('//input[@id="NextButton"]').submit()
  49.  
  50. # Page 14 - What you ordered
  51. element = self.driver.find_element_by_id("R000091")
  52. self.driver.execute_script("arguments[0].click();", element)
  53. driver.find_element_by_xpath('//input[@id="NextButton"]').submit()
  54.  
  55. element = self.driver.find_element_by_id("R000097")
  56. self.driver.execute_script("arguments[0].click();", element)
  57. driver.find_element_by_xpath('//input[@id="NextButton"]').submit()
  58.  
  59. # Page 16 - Page 19
  60. radiovaluelist = [('simpleInput rbl', 1), ('simpleInput rblv', 5),
  61. ('simpleInput rblv', 2), ('simpleInput rblv', 1), ]
  62. for radiovalue in radiovaluelist:
  63. self.selectRadiosSubmit(radiovalue)
  64.  
  65. # Page - Gender and age
  66. driver.find_element_by_xpath("//select[@id='R069000']").find_element_by_xpath("//option[@value='2']").click()
  67. time.sleep(3)
  68. driver.find_element_by_xpath("//select[@id='R070000']").find_element_by_xpath("//option[@value='3']").click()
  69. driver.find_element_by_xpath('//input[@id="NextButton"]').submit()
  70. time.sleep(3)
  71.  
  72. # Page - Share zip code
  73. driver.find_element_by_xpath('//input[@id="NextButton"]').click()
  74. time.sleep(10)
  75.  
  76. # Page - Last page get screenshot
  77. driver.get_screenshot_as_file('%s.png' % time.strftime("%Y%m%d.%H.%M.%S"))
  78.  
  79. def selectRadiosSubmit(self, radioattribute):
  80. elements = self.driver.find_elements_by_xpath(
  81. '//input[@class="{}" and @value="{}"]'.format(radioattribute[0], radioattribute[1]))
  82. print(len(elements))
  83. for element in elements:
  84. self.driver.execute_script("arguments[0].click();", element)
  85. time.sleep(3)
  86. self.driver.find_element_by_xpath('//input[@id="NextButton"]').submit()
  87. time.sleep(3)
  88.  
  89. def tearDown(self) -> None:
  90. self.driver.quit()
  91.  
  92. if __name__ == "__main__":
  93. unittest.main()

 

  需要注意的几个问题:

  • 汉堡王客户调查页面的Radio是没办法直接调用click的, 会抛‘could not be scrolled into view’ Exception.需要调用Javascript进行点击。没有试ActionChains可否操作, 同样的问题对于checkbox也是,需要调用Javascript进行点击。
  • 汉堡王客户调查页面的Radio也是有区别的,有的class = 'simpleInput rbl', 有的class = 'simpleInput rblv'
  • 页面上多组Radio的ID值是变动的,不能直接使用,所以用了class 加 value定位。原本我打算用ends-with的,但是试了好像不行。这个ends-with对于xpath的定位比较弱,不太好匹配上,即使你觉得本应该没问题, 不建议使用。
  • selenimu的上脚本点击的速度是远超过页面响应速度的,所以必要的时候,要强制time.sleep(), 或者使用WebDriver的显示等待。建议每个action后都稍微sleep下,特别是页面跳转的时候。对于关键元素WebDriver进行check
  • 这些页面里面没有iframe,所以你不会碰到iframe导致的元素找不到的问题。
  • 还需要注意button上的click()和submit()方法是略有不同的。click()对于button来说都可以使用,submit()用于在点击button后提交表单数据,使用需要满足一定的条件, 比如按钮的type='submit',而且这个按钮要在<form> tag里面。
  • 我没有添加exception的处理,这里的代码只是基础代码,可以自行优化,以及组织。
  • 最后的验证码是保存在一个png文件里面的,需要自己手动去查看。没来得及是实现和抓取。

Python 3 + Selenium 3 实现汉堡王客户调查提交的更多相关文章

  1. [Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍

    前三篇文章介绍了安装过程和通过Selenium实现访问Firefox浏览器并自动搜索"Eastmount"关键字及截图的功能.而这篇文章主要简单介绍如何实现自动登录163邮箱,同时 ...

  2. [Python爬虫] Selenium+Phantomjs动态获取CSDN下载资源信息和评论

    前面几篇文章介绍了Selenium.PhantomJS的基础知识及安装过程,这篇文章是一篇应用.通过Selenium调用Phantomjs获取CSDN下载资源的信息,最重要的是动态获取资源的评论,它是 ...

  3. [Python爬虫] Selenium获取百度百科旅游景点的InfoBox消息盒

    前面我讲述过如何通过BeautifulSoup获取维基百科的消息盒,同样可以通过Spider获取网站内容,最近学习了Selenium+Phantomjs后,准备利用它们获取百度百科的旅游景点消息盒(I ...

  4. [python爬虫] Selenium定向爬取海量精美图片及搜索引擎杂谈

    我自认为这是自己写过博客中一篇比较优秀的文章,同时也是在深夜凌晨2点满怀着激情和愉悦之心完成的.首先通过这篇文章,你能学到以下几点:        1.可以了解Python简单爬取图片的一些思路和方法 ...

  5. [Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

    转载自:http://blog.csdn.net/eastmount/article/details/51231852 一. 文章介绍 源码下载地址:http://download.csdn.net/ ...

  6. 【Python】 Selenium 模拟浏览器 寻路

    selenium 最开始我碰到SE,是上学期期末,我们那个商务小组做田野调查时发的问卷的事情.当时在问卷星上发了个问卷,但是当时我对另外几个组员的做法颇有微词,又恰好开始学一些软件知识了,就想恶作剧( ...

  7. Python 配置 selenium 模拟浏览器环境,带下载链接

    使用浏览器渲染引擎.直接用浏览器在显示网页时解析HTML,应用CSS样式并执行JavaScript的语句. 这方法在爬虫过程中会打开一个浏览器,加载该网页,自动操作浏览器浏览各个网页,顺便把数据抓下来 ...

  8. python爬虫---selenium库的用法

    python爬虫---selenium库的用法 selenium是一个自动化测试工具,支持Firefox,Chrome等众多浏览器 在爬虫中的应用主要是用来解决JS渲染的问题. 1.使用前需要安装这个 ...

  9. [python爬虫] Selenium常见元素定位方法和操作的学习介绍

    这篇文章主要Selenium+Python自动测试或爬虫中的常见定位方法.鼠标操作.键盘操作介绍,希望该篇基础性文章对你有所帮助,如果有错误或不足之处,请海涵~同时CSDN总是屏蔽这篇文章,再加上最近 ...

随机推荐

  1. Vue-Cli 3.x 创建的项目中对 import 引入的 CSS 样式启用 autoprefixer

    问题描述: Vue-Cli 3.x 默认开启了 autoprefixer,但对于在 main.js 中通过 import 引入的 CSS 并没有自动添加前缀 分析原因: autoprefixer 在项 ...

  2. 锁、分布式锁、无锁实战全局性ID

    1.为什么要使用锁 当发生并发时,会产生多线程争夺一个资源,为保证资源的唯一性. JVM锁:对象锁,死锁,重入锁,公平锁,偏向锁 分布式锁:数据库 nosql .zookeeper 面试题:如何排查死 ...

  3. mysql查询表大小

    工作中常用命令参考,收集如下: 查询表大小:select table_name, data_length from information_schema.tables where table_sche ...

  4. nginx无网络启动失败——proxy_pass域名DNS解析出错

    问题: nginx启动或者reload的时候,会对proxy_pass后面的域名进行DNS解析,如果解析失败,启动就会失败或者reload失败. 我们是to B的产品,客户的环境可能是不通公网的,因此 ...

  5. MySQL数据库(六)-- SQL注入攻击、视图、事物、存储过程、流程控制

    一.SQL注入攻击 1.什么是SQL注入攻击 一些了解sql语法的用户,可以输入一些关键字 或合法sql,来导致原始的sql逻辑发生变化,从而跳过登录验证 或者 删除数据库 import pymysq ...

  6. 为什么内核访问用户数据之前,要做access_ok?

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 原理 先看一段小视频,如果内核访问用户 ...

  7. TCP 通信时序及状态变迁

    TCP 通信时序及状态变迁 参考链接: https://www.cnblogs.com/boxker/p/11214886.html https://blog.csdn.net/miss_ruoche ...

  8. java static学习

    原创,转载请注明来源sogeisetsu的博客园 static,在类里面定义公共的属性,它可以统一修改,并只占一个内存.从而达到方便修改和少占内存的目的 先放上代码,您可以先越过代码,看后面的讲解内容 ...

  9. IE浏览器下AJAX缓存问题导致数据不更新的解决办法

    一直知道使用ajax的时候,有的时候会出现数据缓存的问题,当时也没有深究,就是所有的简单粗暴的全部加上cache:false,或者使用在url处加上随机时间函数 今天无意间看见了为什么会出现缓存的原因 ...

  10. MicroK8s及KubeFlow安装文档

    安装简单的k8s大约有三种思路:minikube,microk8s,kubeadm.minikube 虽然是官方出品,但主要还是基于虚拟机做的设计.在 Linux 生产环境下,microk8s 可能是 ...