用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. iOS应用开发应遵循的10条设计原则

    转自:http://mobile.51cto.com/design-309719.htm 1.操控便捷 iOS应用的控制设计应该具有圆润的轮廓和程式化的梯度,操作便捷. 2.结构清晰.导航方便 充分利 ...

  2. sap设置SE38编辑器背景色

    1.SE38,随便找个程序进入,编辑模式. 点击客户端最右下角的文件夹图标: 2.设置normal 背景颜色: 3.退出,重新进就可以了. 这里很多其他类型的颜色和字体设置,根据个人爱好调整.

  3. Docker搭建Wordpress

    搭建 wordpress 1.拉取 wordpress 镜像docker pull wordpress:latest 2.运行 wordpress 镜像 docker run --name wordp ...

  4. Python基础(三)--流程控制之if、while、for,break与continue

    一.流程控制之if……else…… if语句是指编程语言中用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一 if 条件1: 缩进的代码块 elif 条件2: 缩进的代码 ...

  5. Maven编译过程中出现的问题

    在用Jenkins编译Gitlab上代码过程中,实际使用的是Maven服务器上的打包命令,以下为打包过程中出现的问题及解决方案 问题一:Maven无法编译Snapshot版本代码 答:登录至maven ...

  6. Linux服务管理之DHCP

    1.DHCP服务简介 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络 ...

  7. 大数据技术原理与应用:【第二讲】大数据处理架构Hadoop

    2.1 Hadoop概论 创始人:Doug Cutting 1.简介: 开源免费; 操作简单,极大降低使用的复杂性; Hadoop是Java开发的; 在Hadoop上开发应用支持多种编程语言.不限于J ...

  8. 2019南昌网络赛I:Yukino With Subinterval(CDQ) (树状数组套主席树)

    题意:询问区间有多少个连续的段,而且这段的颜色在[L,R]才算贡献,每段贡献是1. 有单点修改和区间查询. 思路:46min交了第一发树套树,T了. 稍加优化多交几次就过了. 不难想到,除了L这个点, ...

  9. Oracle ORA-00923: FROM keyword not found where expected

    不同于 MySQL,请检查 from 之前显示的字段,尤其是 AS 命名符号的引用. 在 Oracle 中单引 AS 'XXX’ 是错误的,需要修改为双引 "XXX" 或者是干脆去 ...

  10. 搜索法 | 1103 dfs搜索:符合条件的多项式

    其实这题我已经写过两遍了,但都是在看过算法笔记的情况下写的.方法不难,只要能想出来. 找到一个项数为k,每项为p次幂,和为n,并且在有多个结果的情况下要求数字之和最大的一个多项式.如果数字之和相等.还 ...