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

上代码:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import unittest
from selenium.webdriver.common.keys import Keys
import time class TellBK(unittest.TestCase):
def setUp(self) -> None:
self.driver = webdriver.Firefox()
self.driver.implicitly_wait(30) def test_fillFeedBack(self):
driver = self.driver
driver.maximize_window()
driver.get('https://tellburgerking.com.cn')
time.sleep(10) # Page 1 - Welcome
# 点击继续
element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//input[@id="NextButton"]')))
element.click() # Page 2 - Fill the codes and continue
# 填写调查代码, FeedbackCode.txt保存调查代码,3个一组,空格分开
codefile = open('FeedbackCode.txt', 'r')
feedbackcode = codefile.read().split(" ")
codefile.close()
for i in range(len(feedbackcode)):
driver.find_element_by_xpath('//input[@id="CN{}"]'.format(i+1)).send_keys(feedbackcode[i])
# 点击开始
driver.find_element_by_xpath('//input[@id="NextButton"]').submit() # Page 3 - Page 12
radiovaluelist = [('simpleInput rblv', 2), ('simpleInput rblv', 2), ('simpleInput rblv', 1),
('simpleInput rbl', 5), ('simpleInput rbl', 5), ('simpleInput rbl', 5),
('simpleInput rbl', 5), ('simpleInput rbl', 9), ('simpleInput rbl', 2),
('simpleInput rbl', 5)]
for radiovalue in radiovaluelist:
self.selectRadiosSubmit(radiovalue) # Page 13 - Say something
    with open('HappyReason.txt') as filereason:
reasontext = filereason.read()
driver.find_element_by_xpath('//textarea[@id="S000122"]').send_keys(reasontext)
# Next
driver.find_element_by_xpath('//input[@id="NextButton"]').submit() # Page 14 - What you ordered
element = self.driver.find_element_by_id("R000091")
self.driver.execute_script("arguments[0].click();", element)
driver.find_element_by_xpath('//input[@id="NextButton"]').submit() element = self.driver.find_element_by_id("R000097")
self.driver.execute_script("arguments[0].click();", element)
driver.find_element_by_xpath('//input[@id="NextButton"]').submit() # Page 16 - Page 19
radiovaluelist = [('simpleInput rbl', 1), ('simpleInput rblv', 5),
('simpleInput rblv', 2), ('simpleInput rblv', 1), ]
for radiovalue in radiovaluelist:
self.selectRadiosSubmit(radiovalue) # Page - Gender and age
driver.find_element_by_xpath("//select[@id='R069000']").find_element_by_xpath("//option[@value='2']").click()
time.sleep(3)
driver.find_element_by_xpath("//select[@id='R070000']").find_element_by_xpath("//option[@value='3']").click()
driver.find_element_by_xpath('//input[@id="NextButton"]').submit()
time.sleep(3) # Page - Share zip code
driver.find_element_by_xpath('//input[@id="NextButton"]').click()
time.sleep(10) # Page - Last page get screenshot
driver.get_screenshot_as_file('%s.png' % time.strftime("%Y%m%d.%H.%M.%S")) def selectRadiosSubmit(self, radioattribute):
elements = self.driver.find_elements_by_xpath(
'//input[@class="{}" and @value="{}"]'.format(radioattribute[0], radioattribute[1]))
print(len(elements))
for element in elements:
self.driver.execute_script("arguments[0].click();", element)
time.sleep(3)
self.driver.find_element_by_xpath('//input[@id="NextButton"]').submit()
time.sleep(3) def tearDown(self) -> None:
self.driver.quit() if __name__ == "__main__":
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. 个人项目-WC (java实现)

    一.Github地址:https://github.com/734635746/WC 二.PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) ...

  2. Centos7允许使用密码登录

      现在使用云主机比较多,所以一般都是使用秘钥登录,当做一个集群的时候需要几台机器之间免密登录时,就需要修改他的配置文件了,刚做运维那会儿,很熟练,现在忘得差不多了,特此记录一下,下次又这个需求时就不 ...

  3. Java JMS——消息服务

    转载请注明原文地址: https://www.cnblogs.com/ygj0930/p/10921569.html 一:什么是Java消息服务—— 消息通信接口规范 Java消息服务指的:两个应用程 ...

  4. django-orm 快速清理migrations缓存

    Shell #!/bin/bash Project_dir=`pwd` find $Project_dir -type d -a -name 'migrations' \ -exec rm -rf { ...

  5. php对接app支付宝支付出错Cannot redeclare Decrypt()

    报错原因: alipaySDK中定义的Encrypt()/Decrypt()函数与Laravel中定义的Encrypt()/Decrypt()函数重名了. 解决办法: 修改alipaySDK中定义的函 ...

  6. Java错误体系

    1.Java所有的异常错误都继承与Throwable类,只有继承了Throwable类,才能在异常传递体系中进行. 2.Throwable下有两个重要的子类,Error和Exception Error ...

  7. linux后台运行相关命令

    1.nohup & 让程序后台运行,nohup 命令 & 2.jobs 查看当前有多少在后台运行的命令 jobs -l选项可显示所有任务的PID,jobs的状态可以是running, ...

  8. NOIP 2014 比例简化

    洛谷 P2118 比例简化 洛谷传送门 JDOJ 2892: [NOIP2014]比例简化 T2 JDOJ传送门 Description 在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结 ...

  9. 第05组 Beta冲刺(4/4)

    第05组 Beta冲刺(4/4) 队名:天码行空 组长博客连接 作业博客连接 团队燃尽图(共享): GitHub当日代码/文档签入记录展示(共享): 组员情况: 组员1:卢欢(组长) 过去两天完成了哪 ...

  10. classmethode,staticmethode、反射

    目录 classmethod: staticmethod: classmethod与staticmethod都是python解释器内置的装饰器 类中定义的函数分为两大类:绑定方法和非绑定方法 在类中正 ...