用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. Android 解决Execution failed for task ':app:clean.'报错

    说实话,我还真是没见过比Execution failed for task ':app:clean.'更为恶心,更为不要脸的bug啦,代码没啥问题,一下子行让你爽爽,一下子又不鸟你啦,研究了下,终于找 ...

  2. 分布式session的解决方案

    1.Nginx的ip_hash,对应tomcat的session,由tomcat保存 缺点:一旦tomcat单点挂机,session消失 2.session在tomcat之间复制, 缺点:保存全局se ...

  3. Vue组件间通信6种方式

    摘要: 总有一款合适的通信方式. 作者:浪里行舟 Fundebug经授权转载,版权归原作者所有. 前言 组件是 vue.js 最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的 ...

  4. java mybatis Column 'AAA' in where clause is ambiguous

    今天在java mybatis项目中遇到一个问题,“java mybatis Column 'AAA' in where clause is ambiguous”, 这是由于在多表连接查询的时候,遇上 ...

  5. MYSQL入门操作和常规DML、DDL、DQL使用

    刷新权限,将某些权限从硬盘刷新到内存中(修改root密码自带隐式刷新权限操作) mysql> flush privileges; Query OK, 0 rows affected (0.00 ...

  6. org.json package

    JSON is a light-weight,language independent,data interchange format. org.json package implement JSON ...

  7. 让configure和cmake编译时支持调试选项

    在Linux先编译软件基本都是采用configure文件生成makefile,或者,cmake生成makefile文件两种方式.它们生成的makefile文件,一般默认不支持-g调试选项.但我们使用这 ...

  8. ansible自动化运维02

    ansible清单管理 inventory文件通常用于定义要管理主机的认证信息,例如:ssh登录用户名,密码,以及key相关信息. 举个例子:定义清单组 注意:组名为pro,关键字段children表 ...

  9. python socket 传输文件

    推荐资料 https://www.cnblogs.com/xiaokang01/p/9865724.html socket传输文件 思路: # 先将报头转换成字符串(json.dumps), 再将字符 ...

  10. CEF3相关知识汇总(不断更新)

    CEF全称是Chromium Embedded Framework,它是Chromium的Content API的封装库. CEF官网地址:https://bitbucket.org/chromium ...