学习笔记之webdriver_API_02

定位一组元素

与页面定位元素不同的是element多s

find_elements_by_id()
find_elements_by_name()
find_elements_by_class_name()
find_elements_by_tag_name()
find_elements_by_xpath()
find_elements_by_link_text()
fins_elements_by_partial_link_text()
find_elements_by_css_selector()

以以下本地例子为例:

<html>
<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>
        </form>
    </div>
</body>
</html>

用火狐打开显示:
在这里插入图片描述
定位一组input元素:

#定位一组元素
from selenium import webdriver
import os
import time
driver= webdriver.Firefox()
#如果运行代码跟需要运行的网页在同一个路径下面就可以以下方式填写
#如果不在同一个路径下面,可以填写绝对路径F:\**\PycharmProjects\untitled
file_path ='file:///'+os.path.abspath('elements.html')
driver.get(file_path)

#选择页面上所有的tag name 为input的元素
inputs = driver.find_elements_by_tag_name('input')

#然后从中过滤type为CheckBox的元素,单机勾选
for i in inputs:
    i.click()
    time.sleep(1)
else:
    print("over")
driver.quit()

如果页面中input标签过多的话,我们需要定位CheckBox的元素,需要加一个判断

#定位一组元素
from selenium import webdriver
import os
import time
driver= webdriver.Firefox()
#如果运行代码跟需要运行的网页在同一个路径下面就可以以下方式填写
#如果不在同一个路径下面,可以填写绝对路径F:\**\PycharmProjects\untitled
file_path ='file:///'+os.path.abspath('elements.html')
driver.get(file_path)

#选择页面上所有的tag name 为input的元素
inputs = driver.find_elements_by_tag_name('input')

#然后从中过滤type为CheckBox的元素,单机勾选
for i in inputs:
    ##如果页面中的input标签太多,可以加一个判断
    if i.get_attribute('type')=='checkbox':
        i.click()
        time.sleep(1)
else:
    print("over")

driver.quit()

使用elements中的xpath方法选择一组CheckBox元素的方法:

#定位一组元素
from selenium import webdriver
import os
import time
driver= webdriver.Firefox()
#如果运行代码跟需要运行的网页在同一个路径下面就可以以下方式填写
#如果不在同一个路径下面,可以填写绝对路径F:\**\PycharmProjects\untitled
file_path ='file:///'+os.path.abspath('elements.html')
driver.get(file_path)

#使用xpath的方法选择页面上所有为input的元素
inputs = driver.find_elements_by_xpath("//input[@type='checkbox']")

#然后从中过滤type为CheckBox的元素,单机勾选
for i in inputs:
    i.click()
    time.sleep(1)
driver.quit()

使用elements中的css方法选择一组CheckBox元素的方法:

#定位一组元素
from selenium import webdriver
import os
import time
driver= webdriver.Firefox()
#如果运行代码跟需要运行的网页在同一个路径下面就可以以下方式填写
#如果不在同一个路径下面,可以填写绝对路径F:\**\PycharmProjects\untitled
file_path ='file:///'+os.path.abspath('elements.html')
driver.get(file_path)

#使用css的方法选择页面上所有为input的元素
inputs = driver.find_elements_by_css_selector('input[type=checkbox]')

#然后从中过滤type为CheckBox的元素,单机勾选
for i in inputs:
    i.click()
    time.sleep(1)
driver.quit()

定位一组CheckBox元素,在元素中有选择性的勾选某个元素:

#定位一组CheckBox元素,在元素中有选择性的勾选某个元素
'''使用Python中的pop方法可以实现
pop(-1)默认获取一组元素中的最后一个
pop(0)默认获取一组元素中的第一个
pop(1)默认获取一组元素中的第二个
....
'''
from selenium import webdriver
import os
import time
driver= webdriver.Firefox()
file_path ='file:///'+os.path.abspath('elements.html')
driver.get(file_path)
#使用xpath的方法选择页面上所有为input的元素
inputs = driver.find_elements_by_xpath("//input[@type='checkbox']").pop(-1).click()
time.sleep(2)
driver.quit()

也可以用数组的方式来实现:

#定位一组CheckBox元素,在元素中有选择性的勾选某个元素
from selenium import webdriver
import os
import time
driver= webdriver.Firefox()
file_path ='file:///'+os.path.abspath('elements.html')
driver.get(file_path)
#使用xpath的方法选择页面上所有为input的元素,选中第二个元素,第二个元素的角标为1
inputs = driver.find_elements_by_xpath("//input[@type='checkbox']")[1].click()
time.sleep(2)
driver.quit()

多表单切换

以下例子为例:
表单里面嵌套的一个百度页面

<html>
<body>
<div class="row-fluid">
    <div class="span10 well">
        <h3>frame</h3>
        <iframe id="if" name="nf" src="http://www.baidu.com" width="800" height="300"></iframe>
    </div>
</div>
</body>
</html>

使用百度里面的文本框输入“selenium”,并按下“百度一下”的按钮:

from selenium import webdriver
import time,os
driver = webdriver.Firefox()
file_path ='file:///'+os.path.abspath('frame.html')
driver.get(file_path)

#切换到iframe(id="if"),里面只能填写id或者name,其他的不能用
driver.switch_to_frame("if")
#下面就可以正常的操作元素
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
time.sleep(2)
driver.quit()

使用xpath的方法实现以上操作:
使用xpath就不会局限于使用ID或者name两种方式了

from selenium import webdriver
import time,os
driver = webdriver.Firefox()
file_path ='file:///'+os.path.abspath('frame.html')
driver.get(file_path)
#使用xpath
xp = driver.find_element_by_xpath("//iframe[@id='if']")
driver.switch_to_frame(xp)
#下面就可以正常的操作元素
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
time.sleep(2)
driver.quit()

多层表单同时操作的话
先在一个表单内操作完后,使用driver.switch_to.default_content()方法退出到表单最外层
指定返回上一级表单的方法为:driver.switch_to.parent_content()

多窗口切换

以百度搜索页、百度注册页为例:

from selenium import webdriver
import time
driver= webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
#获得当前窗口句柄
sreach_windows = driver.current_window_handle
driver.find_element_by_link_text(u"登录").click()
driver.find_element_by_link_text(u"立即注册").click()
#获得当前所有打开窗口的句柄
all_handles = driver.window_handles
#进入注册窗口
for handle in all_handles:
    if handle !=sreach_windows:
        driver.switch_to_window(handle)
        print("now register window!")
        driver.find_element_by_name("userName").send_keys('username001')
        driver.find_element_by_link_text("密码").send_keys("password")
#进入搜索窗口
for handle in all_handles:
    if handle == sreach_windows:
        driver.switch_to_window(handle)
        print("now sreach window")
        driver.find_element_by_id('TANGRAM__PSP_4__closeBtn').click()
        driver.find_element_by_id("kw").send_keys("selenium")
        driver.find_element_by_id("su").click()
time.sleep(5)

警告框处理

在webdriver中处理JavaScript所生成的alert、confirm以及prompt。使用switch_to_alert()方法定位到alert/conconfirm/prompt。然后使用text/accept/dismiss/send_keys按需进行操作。

  1. text 返回alert/conconfirm/prompt中的文字信息
  2. accept 点击确认按钮
  3. dismiss 点击取消按钮,如果有的话
  4. send_keys 输入值,这个alert/conconfirm没有对话框就不能用了,不然会报错
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
#鼠标悬停停向“设置”链接
link = driver.find_element_by_link_text("设置")
time.sleep(2)
ActionChains(driver).move_to_element(link).perform()
time.sleep(2)
#打开搜索设置
driver.find_element_by_class_name('setpref').click()
time.sleep(2)
#保存设置
driver.find_element_by_css_selector('#gxszButton > a.prefpanelgo').click()
time.sleep(2)
#接收弹窗
driver.switch_to_alert().accept()
time.sleep(1)
driver.quit()

简化写法:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
#鼠标悬停停向“设置”链接
link = driver.find_element_by_link_text("设置").click()
time.sleep(2)
link = driver.find_element_by_link_text("搜索设置").click()
time.sleep(2)
#保存设置
driver.find_element_by_css_selector('#gxszButton > a.prefpanelgo').click()
time.sleep(2)
#接收弹窗
driver.switch_to_alert().accept()
time.sleep(1)
driver.quit()

上传文件

以以下代码为例:

<html>
<body>
<div clas="row-fluid">
    <div class="span6 well">
        <h3>upload_file</h3>
        <input type="file" name="file"/>
    </div>
</div>
</body>
</html>

普通上传

from selenium import webdriver
import os,time
driver=webdriver.Firefox()
#打开上传功能页面
file_path = 'file:///'+os.path.abspath('upfile.html')
driver.get(file_path)
#定位上传按钮,添加本地文件
driver.find_element_by_name("file").send_keys('C:\\Users\lenovo\Desktop\\20200204145800.png')
time.sleep(2)
driver.quit()

插件上传

使用Autolt实现上传,它是用户界面的自动化工具
官方网址:https://www.autoitscript.com/site/autoit/downloads/
以下为Autolt的界面:
安装好后,打开Autolt Window Info(x64)
Autolt使用的Vbscript语言
在这里插入图片描述
使用Finder Tool选择界面上的元素,选择的时候,按住其按钮,一直不要松开
选择好后,再打开SciTE Script Editor,如下图:
在这里插入图片描述
在编辑器中写上传步骤:

;ContrlFoucs("title","text",ControlID)Edit1=Edit instance 1
ControlFocus("文件上传","","Edit1")
;Wait 10 seconds For the Upload window to appear
WinWait("[CLASS:#32770]","",10)
;Set the File name text on the Edit field
ControlSetText("文件上传","","Edit1","C:\Users\lenovo\Desktop\20200204145800.png")
Sleep(2000)
;Click on the Open button
ControlClick("文件上传","","Button1");

在Tools中单机go运行脚本,运行脚本的时候必须打开上传窗口如下图:
在这里插入图片描述
单机运行就可以运行脚本
然后用Python调用这个VBScript脚本
将Autrol脚本生成exe文件,用Autrol的Compile Script to.exe(X64)
打开后如下图:
在这里插入图片描述
选择刚刚写好的脚本,convert就可以生成exe文件
使用Python调用其上传文件程序:

from selenium import webdriver
import os,time
driver=webdriver.Firefox()
#打开上传功能页面
file_path = 'file:///'+os.path.abspath('upfile.html')
driver.get(file_path)
#点击打开上传窗口
driver.find_element_by_name("file").click()
#调用upfile.exe上传程序
os.system("F:\**\PycharmProjects\\untitled\\upfile.exe")
time.sleep(2)
driver.quit()
发布了24 篇原创文章 · 获赞 0 · 访问量 561

猜你喜欢

转载自blog.csdn.net/MoLi_D/article/details/104169395