分享

【python】用selenium webdriver做简单的表格提交

 LibraryPKU 2019-06-13

selenium webdriver是一个自动化测试工具,相比于直接用get之类的方法能更为直观的模拟用户使用,但是,对我而言就是,额,挺好玩的,所以这一篇的侧重点是一个接触的过程,并没有很系统的阐述这个工具。

注明:以下都以Chrome为例,IE可能在某些部分细节有所不同。

一、准备:1. Python 3.5 (所需安装包(主要): selenium)

                 2.Chrome (所需插件:ChromeDriver(以及记得添加环境变量PATH))

二、开始:

       1.第一步都是import

  1. from selenium import webdriver
  2. import time
  3. driver = webdriver.Chrome()

       2.登录,如果不需要登录则可以跳过这一步:先通过右键查看源码(关键段)

  1. <label class="control-label" for="loginform-employee_no">管理账号</label>
  2. <input type="text" id="loginform-employee_no" class="form-control" name="LoginForm[employee_no]">

  3. <p class="help-block help-block-error"></p>
  4. </div> <div class="form-group field-loginform-password required">
  5. <label class="control-label" for="loginform-password">密码</label>
  6. <input type="password" id="loginform-password" class="form-control" name="LoginForm[password]">

 接下来我们来了解下selenium的定位方法:

selenium的工作原理就是首先定位一个元素,然后再对其进行操作。Lucky,这段源码有id值,我们知道在html里id都是唯一的。因此这里我们找到的两个ID:id="loginform-employee_no" id="loginform-password" 可以用elem_user = driver.find_element_by_id 这一方法来定位。

然后是操作部分:用keys类来模拟键盘输入send(也可以是回车或者空格等等操作),先import Keys类:

from selenium.webdriver.common.keys import Keys
综合一下:
  1. elem_user = driver.find_element_by_id("loginform-employee_no")
  2. elem_user.send_keys("用户名")
  3. elem_pwd = driver.find_element_by_id("loginform-password")
  4. elem_pwd.send_keys("密码")
  5. elem_pwd.send_keys(Keys.RETURN) #return和enter都是回车键,只是表达不同。
time.sleep(2)  #sleep这一步跟网络环境有关,有时候如果输入太快,可能会引起报错。单位为秒。后面不再重复写。

3.登录后就可以开始我们的填表了,直接开车(drive)到填表页面(仅针对URL不变的填表地址,如果url是变动的需要另外处理这步driver.get):

driver.get("http://表单网址")

我们来看下这个需要填的内容:

等级: 这个内容是个下拉菜单的类型:

看下源码:

  1. <select id="employee-worker_level" class="form-control" name="Employee[worker_level]">
  2. <option value="兼职">兼职</option>
  3. <option value="见习">见习</option>
  4. <option value="初级">初级</option>
  5. <option value="中级">中级</option>
  6. <option value="高级">高级</option>
  7. </select>
好消息是这个下拉选择框有id,那么我么就可以像刚才那样的定位,但是坏消息是,这个下拉选择框的选项没有id,这时我们可以另一个定位方法,用tag name,find_elements_by_tag_name , 这里是 ”option“,并且是以类似list的方式存在的,所以引用标签是0-4 代表着五个选项。所以这里我们如果要选选项4的代码如下:
driver.find_element_by_id("employee-worker_level").find_elements_by_tag_name("option")[3].click()
这里的click代表的是左键单击。

工作角色:这个是个checkbox类的提交内容:

  1. <div class="help-block"></div>
  2. </div> <div class="form-group field-employee-worker_role">
  3. <label class="control-label" for="employee-worker_role">工作角色</label>
  4. <input type="hidden" name="Employee[worker_role]" value=""><div id="employee-worker_role"><label><input type="checkbox" name="Employee[worker_role][]" value="1"> 宣传人员</label>
  5. <label><input type="checkbox" name="Employee[worker_role][]" value="2"> 收费人员</label>
  6. <label><input type="checkbox" name="Employee[worker_role][]" value="3"> 维护人员</label>
  7. <label><input type="checkbox" name="Employee[worker_role][]" value="4"> 安装人员</label>
  8. <label><input type="checkbox" name="Employee[worker_role][]" value="5"> 移机人员</label>
  9. <label><input type="checkbox" name="Employee[worker_role][]" value="9"> 综合人员</label>
  10. <label><input type="checkbox" name="Employee[worker_role][]" value="10"> 投诉专岗</label>
  11. <label><input type="checkbox" name="Employee[worker_role][]" value="11"> 新开销售</label></div>
  12. <div class="hint-block">选择人员的工作角色,如果非实际工作人员,请留空</div>
  13. <div class="help-block"></div>
  14. </div>
这里也是类似的,我们看到有label这个tag name所以可以直接用label name,但是,如果我们需要复选的话,很简单,用个循环就行了:
  1. i=0
  2. while (i<8) :
  3. driver.find_element_by_id("employee-worker_role").find_elements_by_tag_name("label")[i].click()
  4. i=i+1
(其实用for更简单,但是我就是习惯用while再见

其他的需要填的内容就和登录里需要的是类似的。

最后我们只需要用keys类回车一下,就可以提交表格了。

bonus:

好奇提交表格的时候能不能用click动作来完成,走向了作死之路:

我们先来看下提交的代码:

  1. <div class="form-group">
  2. <button type="submit" class="btn btn-success">添加</button> </div>

  3. </form></div>
等等,id呢?name呢?让我们看下其他的定位方法:

通过id定位元素:find_element_by_id("id_vaule")
通过name定位元素:find_element_by_name("name_vaule")
通过tag_name定位元素:find_element_by_tag_name("tag_name_vaule")
通过class_name定位元素:find_element_by_class_name("class_name")
通过css定位元素:find_element_by_css_selector();
通过xpath定位元素:find_element_by_xpath("xpath")
通过link定位:find_element_by_link_text("text_vaule")或者find_element_by_partial_link_text()
好的,貌似目前只能用Xpath的方法来定位了,让我们来学习一下Xpath是什么,这里有一个教程:http://www.w3school.com.cn/xpath/index.asp 然后我们知道了,爸爸的爸爸是爷爷,各种类的定义,以及语法,接下来只要按教程简单的写出路径……等等,为什么都是div?难道只能一个个数了吗?查找后忽然发现,可以用浏览器比如chrome的检查功能就可以知道Xpath:


复制之后,我们的代码就是:

driver.find_element_by_xpath('//*[@id="w0"]/div[11]/button').click() #记得注意单双引号
报错:
unknown error: Element <button type="submit" class="btn btn-success">...</button> is not clickable at point (57, 691). Other element would receive the click: <footer class="footer">...</footer>
  (Session info: chrome=58.0.3029.110)
  (Driver info: chromedriver=2.29.461591 (62ebf098771772160f391d75e589dc567915b233),platform=Windows NT 6.1.7601 SP1 x86_64)

查找后原因是在当前页面这个元素不可见,比如页面只有300×300 但是元素定位在150×400,那么对于这个对于浏览器来说就看不见了,当然人是知道还有下拉页面的。(据说IE和FF是没有这个问题的。)

那么我们的思路就变成了,要如何下拉页面:

1.借助Java (具体大家戳参考4)

  1. target = driver.find_element_by_id("id_keypair")
  2. driver.execute_script("arguments[0].scrollIntoView();", target) #拖动到可见的元素去
2.利用键

用TAB键(或者向下键)

这里我们测试一下向下键(找到最底下的元素,离提交最近的,再来一次TAB),最后再点击:

  1. elem_user = driver.find_element_by_id("employee-move_time" )
  2. elem_user.send_keys(Keys.TAB)
driver.find_element_by_xpath('//*[@id="w0"]/div[11]/button').click()
成功,撒花~

参考文章:

1.http://blog.csdn.net/jojoy_tester/article/details/53558402

2.http://www.cnblogs.com/lincj/p/3668215.html

3.http://www.w3school.com.cn/xpath/index.asp

4.http://www.cnblogs.com/landhu/p/5761794.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多