selenium~进阶操作定位一组元素、定位多层框架/窗口、下拉框处理、提示框处理、上传文件操作

定位一组元素

  • ebdriver 可以很方便的使用findElement 方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,这时候就需要使用findElements 方法。
  • 定位一组对象一般用于以下场景:
  1. 批量操作对象,比如将页面上所有的checkbox 都勾上
  2. 先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。比如定位出页面上所有的checkbox,然后选中点击
  • get_attribute:获得属性值。
from selenium import webdriver
import time
import os

driver = webdriver.Chrome()
# 打开本地html文件
path = "file:///" + os.path.abspath("D:/Tool/%E6%B5%8B%E8%AF%95%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B71/selenium2html/checkbox.html")
driver.get(path)
# 获取页面上一组的input元素 然后逐一进行判断
inputs = driver.find_elements_by_tag_name("input")

for input in inputs:
    if input.get_attribute("type") == 'checkbox':
        input.click()

time.sleep(2)

多层框架/窗口定位

  • 多层框架或窗口的定位:
    switch_to.frame()
    switch_to.window()
  • 对于一个现代的web 应用,经常会出现框架(frame) 或窗口(window)的应用,这也就给我们的定位带来了一个难题。有时候我们定位一个元素,定位器没有问题,但一直定位不了,这时候就要检查这个元素是否在一个frame 中,
    seelnium webdriver 提供了一个switch_to.frame 方法,可以很轻松的来解决这个问题。
    switch_to.frame(name_or_id_or_frame_element):
  • 可以简单记忆一下,如果这个frame有name和id属性那么就用这两个属性就好,如果没有的话可以先用 find_element.by_xxx方法找到这个frame元素,然后把这个元素传进去,这也是可行的。
    switch_to.frame()把当前定位的主体切换了frame里。怎么理解这句话呢?我们可以从frame的实质去理解。
    frame中实际上是嵌入了另一个页面,而webdriver每次只能在一个页面识别,因此才需要用switch_to.frame方法
    去获取frame中嵌入的页面,对那个页面里的元素进行定位。
  • switch_to_default_content:从frame中嵌入的页面里跳出,跳回到最外面的原始页面中。
from selenium import webdriver
import time
import os

driver = webdriver.Chrome()
# 打开本地html文件
path = "file:///" + os.path.abspath("D:/Tool/%E6%B5%8B%E8%AF%95%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B71/selenium2html/frame.html")
driver.get(path)
driver.implicitly_wait(30)
# 进入下一级框架
driver.switch_to.frame("f1")
driver.switch_to.frame("f2")
driver.find_element_by_id("kw").send_keys("詹姆斯")
driver.find_element_by_id("su").click()
# 回到初始框架
driver.switch_to_default_content()
# 再重新进去
driver.switch_to.frame("f1")
driver.implicitly_wait(30)
driver.close()

多层窗口定位

有可能嵌套的不是框架,而是窗口,还有真对窗口的方法:switch_to_window
用法与switch_to_frame 相同:
driver.switch_to_window(“windowName”)

from selenium import webdriver
from selenium.webdriver.support.ui import webDriverwait
import time
import os

dr = webdriver.Chrome()
file_path = 'file:///' + os.path.abspath('level_locate.html')
dr.get(file_path)
# 点击Link1链接(弹出下拉列表)
dr.find_element_by_link_text('Link1').click()
# 找到id 为dropdown1的父元素
webDriverwait(dr,10).until(lambda the_driver:
the_driver.find_element_by_id('dropdown1 ').is_displayed())
# 在父亲元件下找到link为Action的子元素
menu = dr.find_element_by_id('dropdown1').find_element_by_link_text('Action')
# 鼠标定位到子元素上
webdriver.ActionChains(dr).move_to_element(menu) .perform()
time.sleep(2)
dr.quit()

下拉框处理

  • 下拉框是我们最常见的一种页面元素,对于一般的元素,我们只需要一次就定位,但下拉框里的内容需要进行两次定位,先定位到下拉框,再定位到下拉框内里的选项。
import os
import time
from selenium import webdriver

driver = webdriver.Chrome()
file_path = 'file:///' + os.path.abspath("D:/Tool/%E6%B5%8B%E8%AF%95%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B71/selenium2html/drop_down.html")
driver.get(file_path)
time.sleep(2)
# 先定位到下拉框
m = driver.find_element_by_id("ShippingMethod")

# 再点击下拉框下的选项
# m.find_element_by_xpath("//option[@value='10.69']").click()

# 通过获取一组元素按数组中的位置去选择下拉框
options = driver.find_elements_by_tag_name("option")
options[2].click()
time.sleep(3)
driver.quit()

提示框处理

text 返回alert/confirm/prompt 中的文字信息
accept 点击确认按钮
dismiss 点击取消按钮,如果有的话
send_keys 输入值,这个alert\confirm 没有对话框就不能用了,不然会报错

#接受警告信息
alert = dr.switch_to_alert() 
alert.accept() 
#得到文本信息打印
alert = dr.switch_to_alert() 
print alert.text 
#取消对话框(如果有的话)
alert = dr.switch_to_alert() 
alert.dismiss() 
#输入值
alert = dr.switch_to_alert() 
alert.send_keys("hello word")
  • 注意:switch_to.alert()只能处理原生的alert
from selenium import webdriver
import time
import os

dr = webdriver.Firefox()
file_path = 'file:///' + os.path.abspath("D:/Tool/%E6%B5%8B%E8%AF%95%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B71/selenium2html/alert.html#")
dr.get(file_path)
# 点击链接弹出alert
dr.find_element_by_link_text("hover to see tooltip").click()
time.sleep(3)
# 接受警告信息
alert = dr.switch_to.alert()
alert.accept()
# 得到文本信息打印
print(alert.text)

time.sleep(2)
dr.quit()

DIV对话框

  • 更多的时候我们在实际的应用中碰到的并不是简单警告框,而是提供更多功能的会话框。

from selenium import webdriver
from time import sleep
import os


dr = webdriver.Chrome()
file_path = "file:///D:/Tool/%E6%B5%8B%E8%AF%95%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B71/selenium2html/modal.html"
dr.get(file_path)
# 打开对话框
dr.find_element_by_id('show_modal').click()
sleep(3)
# 点击对话框中的链接
link = dr.find_element_by_id('myModal').find_element_by_id('click')
link.click()
sleep(4)
# 关闭对话框
buttons = dr.find_element_by_class_name('modal-footer').find_elements_by_tag_name('button')
buttons[0].click()
sleep(2)
dr.quit()

上传文件操作

  • 文件上传操作也比较常见功能之一,上传功能没有用到新有方法或函数,关键是思路。上传过程一般要打开一个本地窗口,从窗口选择本地文件添加。所以,一般会卡在如何操作本地窗口添加上传文件。
  • 其实,在selenium webdriver 没我们想的那么复杂;只要定位上传按钮,通过send_keys 添加本地文件路径就可以了。绝对路径和相对路径都可以,关键是上传的文件存在。
from selenium import webdriver
import os, time

driver = webdriver.Chrome()
file_path = 'file:///' + os.path.abspath("D:/Tool/%E6%B5%8B%E8%AF%95%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B71/selenium2html/upload.html")
driver.get(file_path)
# 定位上传按钮,添加本地文件
driver.implicitly_wait(30)
driver.find_element_by_name("file").send_keys("D:/test/object.txt")
time.sleep(10)
driver.quit()
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值