微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

轻松自动化---selenium-webdriver(python) (四)

https://www.cnblogs.com/fnng/p/3190966.html

 

http://www.testclass.net/  测试教程网,专业的selenium 学习网站。

本节要解决的问题:

如何定位一组元素?

 

场景

从上一节的例子中可以看出,webdriver可以很方便的使用findElement方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,

这时候就需要使用findElements方法

 

定位一组对象一般用于以下场景:

· 批量操作对象,比如将页面上所有的checkBox都勾上

· 先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。比如定位出页面上所有的checkBox,然后选择最后一个

复制代码

<html>
    <head>
        <Meta http-equiv="content-type" content="text/html;charset=utf-8" />
        <title>CheckBox</title>
        <script type="text/javascript" async="" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
        <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet" />
        <script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
    </head>
    <body>
        <h3>checkBox</h3>
        <div class="well">
            <form class="form-horizontal">
                <div class="control-group">
                    <label class="control-label" for="c1">checkBox1</label>
                    <div class="controls">
                        <input type="checkBox" id="c1" />
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="c2">checkBox2</label>
                    <div class="controls">
                        <input type="checkBox" id="c2" />
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="c3">checkBox3</label>
                    <div class="controls">
                        <input type="checkBox" id="c3" />
                    </div>
                </div>    
        
                <div class="control-group">
                    <label class="control-label" for="r">radio</label>
                    <div class="controls">
                        <input type="radio" id="r1" />
                    </div>
                </div>
                
                <div class="control-group">
                    <label class="control-label" for="r">radio</label>
                    <div class="controls">
                        <input type="radio" id="r2" />
                    </div>
                </div>
            </form>
        </div>
    </body>
</html>

复制代码

将这段代码保存复制到记事本中,将保存成checkBox.html文件。(注意,这个页面需要和我们的自动化脚本放在同一个目录下)

 

 

 

第一种方法

通过浏览器打个这个页面我们看到三个复选框和两个单选框。下面我们就来定位这三个复选框。

复制代码

# -*- coding: utf-8 -*-
from selenium import webdriver
import time
import os

dr = webdriver.Firefox()
file_path =  'file:///' + os.path.abspath('checkBox.html')
dr.get(file_path)

# 选择页面上所有的input,然后从中过滤出所有的checkBox并勾选之
inputs = dr.find_elements_by_tag_name('input')
for input in inputs:
    if input.get_attribute('type') == 'checkBox':
        input.click()
time.sleep(2)

dr.quit()

复制代码

你可以试着把input.get_attribute('type') == 'checkBox' 中的checkBox 变成radio ,那这个脚本定位的会是两个单选框。

 

第二种定位方法

复制代码

# -*- coding: utf-8 -*-
from selenium import webdriver
import time
import os

dr = webdriver.Firefox()
file_path =  'file:///' + os.path.abspath('checkBox.html')
dr.get(file_path)

# 选择所有的checkBox并全部勾上
checkBoxes = dr.find_elements_by_css_selector('input[type=checkBox]')
for checkBox in checkBoxes:
    checkBox.click()
time.sleep(2)

# 打印当前页面上有多少个checkBox
print len(dr.find_elements_by_css_selector('input[type=checkBox]'))
time.sleep(2)

dr.quit()

复制代码

第二种写法与第一种写法差别不大,都是通过一个循环来勾选控件;如果你学过上一章的话,细心的你一定发现用的定位函数不一样,

第一种用的name ,第二种用的CSS 。

 

 如何去掉勾选:

还有一个问题,有时候我们并不想勾选页面的所有的复选框(checkBox),可以通过下面办法把最后一个被勾选的框去掉。如下:

复制代码

# -*- coding: utf-8 -*-
from selenium import webdriver
import time
import os

dr = webdriver.Firefox()
file_path =  'file:///' + os.path.abspath('checkBox.html')
dr.get(file_path)

# 选择所有的checkBox并全部勾上
checkBoxes = dr.find_elements_by_css_selector('input[type=checkBox]')
for checkBox in checkBoxes:
    checkBox.click()
time.sleep(2)

# 把页面上最后1个checkBox的勾给去掉
dr.find_elements_by_css_selector('input[type=checkBox]').pop().click()
time.sleep(2)

dr.quit()

复制代码

其实,去掉勾选表也逻辑也非常简单,就是再次点击勾选的按钮。可能我们比较迷惑的是如何找到“最后一个”按钮。pop() 可以实现这个功能

好吧!在web自动化的学习过程中,我们必须要知道一些前端的东西,这里扩展一下:

http://www.w3school.com.cn/js/jsref_pop.asp

 

 

尝试

把find_elements_by_css_selector('input[type=checkBox]').pop().click() 中的checkBox 变成radio 会是什么效果,自己尝试一下吧!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐