webdriver-元素定位

1.Select下拉列表

1.1下拉列表单选

在这里插入图片描述
在这里插入图片描述

from selenium import webdriver
from selenium.webdriver.support.ui import Select
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://sahitest.com/demo/selectTest.htm')
se = Select(driver.find_element('id', 's1Id')) # 定位下拉列表元素

# 根据索引选择 0-表示第一列
se.select_by_index(1)  # 结果:选中o1

# 根据值来选择 前端页面value="o2"
se.select_by_value('o2') # 结果:选中o2

#根据文本选择,下拉列表显示的文字
se.select_by_visible_text('o3') # 结果:选中o3

#循环打印下拉框选项  options 所有选项
for options in se.options:
    print(options.text)    

1.2下拉列表多选

在这里插入图片描述

在这里插入图片描述

from selenium import webdriver
from selenium.webdriver.support.ui import Select
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://sahitest.com/demo/selectTest.htm')
# 选择连续的几列
se = Select(driver.find_element('id', 's4Id')) # 定位下拉列表元素
for i in range(2, 6):
    se.select_by_index(i) # 显示o2到最后一个

# 选择不连续的几列,结合ctrl键
from selenium.webdriver.common.action_chains import ActionChains 
from selenium.webdriver.common.keys import Keys # 使用键盘

element1 = driver.find_element('xpath', '//*[@id="s4Id"]/option[3]') # 定位o2
element2 = driver.find_element('xpath', '//*[@id="s4Id"]/option[5]') # 定位最后一个
ActionChains(driver).key_down(Keys.CONTROL).click(element1).key_up(Keys.CONTROL).perform() # 选中o2
ActionChains(driver).key_down(Keys.CONTROL).click(element2).key_up(Keys.CONTROL).perform() # 选中最后一个

2.非Select下拉列表

(1)前端效果是这样的,点击输入框,出现下列列表,选择其中一个
在这里插入图片描述
定位输入框,点击,激活下列列表
在这里插入图片描述在这里插入图片描述
定位下列列表的列,注意这里使用Google自带的复制xpath,可能定位不准,需要自己手动去定位列的xpath

在这里插入图片描述

from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('')
driver.find_element('xpath', '//*[@id="userLayout"]/div/div[2]/div/div/form/div[1]/div/div/span/div').click() # 点击输入框,激活下列列表
driver.find_element('xpath', '//div[@id="popContainer"]/div[2]/div/div/div/ul/li[38]').click() # 点击列表的第38列

(2)这种多级下拉列表的与上方雷同。第一级定位点击,激活下一级,第二级定位点击,激活下一级,第三级定位点击。
在这里插入图片描述

#定位输入框,点击,激活下拉列表
driver.find_element('xpath', '//*[@id="popContainer"]/div[1]/div/section/section/main/div/div[2]/div/div/div/div[1]/div/div[2]/form/div/div[1]/div/div[2]/div/span/span').click()
#第一级定位点击,激活下一级下拉列表
driver.find_element('xpath', '//*[@id="popContainer"]/div[2]/div/div/div/ul/li[3]').click()
# 第二级定位点击,激活下一级下拉列表
driver.find_element('xpath', '//*[@id="popContainer"]/div[2]/div/div/div/ul[2]/li[1]').click()
# 第三级定位点击
driver.find_element('xpath', '//*[@id="popContainer"]/div[2]/div/div/div/ul[3]/li[1]').click()

3.文件上传

1.1input单个文件上传

前端代码
在这里插入图片描述

driver.find_element('xpath', '//input[@type="file"]).send_keys('C:\pig\counting-video\5.mp4') # z直接输入文件绝对路径

1.2input多个文件上传

多文件上传就是在文件路径框里用引号括起单个路径,然后用逗号隔开多个路径

1.3非input文件上传

前端:点击-》选择图片或视频上传
在这里插入图片描述
在这里插入图片描述
安装下面两个包

pip install -i https://pypi.douban.com/simple pywin32
pip install pyperclip

实现文件上传的方法

# filePath: 要上传的文件地址,绝对路径。
def Upload_File(filePath):
    # 将文件路径放入剪切板
    pyperclip.copy(filePath)
    time.sleep(2)
    # 发送Ctrl(17)+V(86)按钮
    win32api.keybd_event(17, 0, 0, 0)
    win32api.keybd_event(86, 0, 0, 0)
    # 松开按键
    win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0)
    win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)
    time.sleep(1)

    # 输入回车键(13),第一次确认路径,第二次提交路径
    win32api.keybd_event(13, 0, 0, 0)
    win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0)  # 松开按键
    win32api.keybd_event(13, 0, 0, 0)
    win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0)  # 松开按键
    time.sleep(2)

实现上传

# 首先定位“请选择视频或图片”,并点击
driver.find_element('xpath', '//*[@id="popContainer"]//div[3]').click()
Upload_File(r'D:\testdata\5.mp4') # 注意绝对路径,前面加r,否则\t会被识别为转义字符

4.鼠标键盘

在这里插入图片描述
在这里插入图片描述
from selenium.webdriver import ActionChains # 鼠标操作的类
from selenium.webdriver.common import keys #键盘操作的类
按住ctrl+点击ActionChains,可查看里面有很多方法

from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.baidu.com/')
item = driver.find_element('id', 's-usersetting-top')
ActionChains(driver).move_to_element(item).perform() # 模拟鼠标的移动操作
driver.find_element('link text', '高级搜索').click()

ActionChains(driver).double_click(item).perform() # 双击
ActionChains(driver).click(item).perform() # 单击
ActionChains(driver).context_click(item).perform() # 右键

from selenium.webdriver.common.Keys import keys
    def test_key(self):
        self.driver.get('htpp://www.baidu.com')
        kw = self.driver.find_element_by_id('kw')
        kw.send_keys('selenium')
        kw.send_keys(Keys.CONTROL, 'a')  # 全选 
        kw.send_keys(Keys.CONTROL, 'c')  # 复制
        kw.send_keys(Keys.CONTROL, 'x')  # 剪切
        kw.send_keys(Keys.CONTROL, 'v')  # 粘贴

5.多窗口切换

from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()

driver.get('https://www.baidu.com/')  # 默认百度窗口
current_window = driver.current_window_handle  # 保存当前窗口的句柄
driver.find_element('link text', '贴吧').click()  # 进入贴吧窗口
print(len(driver.window_handles))  # 窗口数量,打开了两个窗口
driver.switch_to.window(driver.window_handles[1])  # 切换到贴吧窗口
driver.find_element('id', 'wd1').send_keys('上海')  # 在贴吧窗口输入框输入
driver.switch_to.window(current_window)  # 切回默认百度窗口
driver.find_element('id', 'kw').send_keys('python')

6.frame操作定位

在web应用中经常会出现frame的嵌套应用,假设页面上有A,B两个frame,B在A内,具体思路:
使用switch_to.frame()方法,把当前定位的主体切换到B frame里
使用switch_to.default_content()从B frame切换回A frame
在这里插入图片描述

from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('')
# 切换到iframe内部的上下文环境中
driver.switch_to.frame(driver.find_element('name', 'iframe1'))
driver.find_element('id', 'kw').send_keys('python')
# 将上下文环境从iframe中切出来
driver.switch_to.default_content()
driver.find_element('link text', '去淘宝').click()

7.滚轮

driver.execute_script("window.scrollTo(xpos, ypos);") # 可以控制页面上下滚动,左右滚动
# xpos 表示x坐标 
# ypos 表示y坐标
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")  # 表示滑到最低部

8.复选框

前端语句用checkbox类型

swimming:<input type="checkbox" name="swimming" value="swimming"><br>
reading:<input type="checkbox" name="reading" value="reading"><br>
from selenium import webdriver
import os
from time import sleep

class TestCase(object):
    def __init__(self):
        """
        获取当前路径下的html文件地址
        """
        self.driver = webdriver.Chrome()
        path = os.path.dirname(os.path.abspath(__file__))  # 获取当前项目路径
        file_path = 'file:///'+path+ '/test.html'
        self.driver.get(file_path)

    def test_checkbox(self):
        swimming = self.driver.find_element_by_name('swimming')
        reading = self.driver.find_element_by_name('reading')
        if not swimming.is_selected:  # 如果没被选中,则点击选中
            swimming.click()
        if not reading.is_selected:
            reading.click()

9.单选框

前端语句用radio类型

gender:<input type="radio" name="gender" value="male"><br>
        <input type="radio" name="gender" value="female"><br>
    def test_radio(self):
        lst = self.driver.find_elements_by_name('gender') # 前端有多个name为gender的,用elements取出就是个列表
        lst[0].click()

10.处理弹框

页面上的弹框有三种:
alert–用来提示
confirm–用来确认
prompt–输入内容

方法 /属性方法/属性描述
accept接受
dismiss()取消
text显示的文本
send_keys输入内容

前端在保存时会弹出提示,删除时要确认,撤销时要输入原因

<a href="javascript:alert('XXX已成功)" id="alert">保存</a>
<a href="javascript:confirm('确定要删除数据吗?)" id="confirm">删除</a>
<a href="javascript:var why=prompt('请输入原因');document.write(why)" id="prompt">撤销</a>
    def test_alert(self):
        self.driver.find_element_by_id('alert').click()
        alert = self.driver.switch_to.alert
        print(alert.text)
        sleep(3)
        alert.accept()
        
    def test_confirm(self):
        self.driver.find_element_by_id('confirm').click()
        confirm = self.driver.switch_to.alert
        print(confirm.text)
        confirm.accept()  # 确认
        confirm.dismiss()  # 取消
    def test_prompt(self):
        self.driver.find_element_by_id('prompt').click()
        sleep(2)
        prompt = self.driver.switch_to.alert
        prompt.accept()

11.执行JavaScript脚本

webDriver有两个方法来执行JavaScript:
execute_script 同步执行
execute_async_script 异步执行

from selenium import webdriver

class TestCase(object):
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.get('http://www.baidu.com')

    def test1(self):
        self.driver.execute_script("alert('test')")  # 执行弹窗
        self.driver.switch_to.alert.accept()  # 弹窗点击确定

    def test2(self):
        js = 'return document.title'  # js语句获取网页标题
        title = self.driver.execute_script(js)  # 执行js语句
        print(title)

    def test3(self):
        js = 'var q = document.getElementById("kw"); q.style.border="2px solid red"' # js语句定位搜索框,将搜索框变成红色
        self.driver.execute_script(js)

    def test4(self):
        self.driver.find_element_by_id('kw').send_keys('selenium')
        self.driver.find_element_by_id('su').click()
        js = 'window.scrollTo(0,document.body.scrollHeigh)' # 滑到底部
        self.driver.execute_script(js)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值