[自动化测试]selenium webdriver api

二.webdriver API

1.定位元素

1)id 定位
from selenium import webdriver
import time

from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
# 通过百度页面的 chrome 控制台检查元素可以得知,输入框对应的 id = "kw",点击按钮对应的 id = "su"
# 定位到元素后,就可以 send_keys() 输入指定文本,click() 触发点击事件
driver.find_element_by_id("kw").send_keys("零之使魔")
driver.find_element_by_id("su").click()

# driver.find_element(By.ID,"kw").send_keys("零之使魔")
# driver.find_element(By.ID,"su").click()
time.sleep(6)
driver.quit()

需要注意的是,find_element_by_id显示已弃用,也可以使用下面find_element(By.ID,"这里输入元素的id") 来通过 id 就进行定位

2) name 定位
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off"> 输入框
<input type="submit" value="百度一下" id="su" class="btn self-btn bg s_btn"> 按钮

name 是标签中的一个属性,根据此属性定位

from selenium import webdriver
import time

from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")

# name 定位
# 使用 name 进行定位元素,点击按钮无 name ,所以使用 id 进行定位
driver.find_element_by_name("wd").send_keys("零之使魔")
driver.find_element_by_id("su").click()

# driver.find_element(By.NAME,"wd").send_keys("零之使魔")
# driver.find_element(By.ID,"su").click()

time.sleep(4)
driver.quit()
3) tag name 定位

tag name 为标签名,也可以根据此定位,但是用的情况很少,因为标签想要唯一,实在是太难了,除非你页面元素很少很少

from selenium import webdriver
import time

from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")

# tag name
# 使用 tag name 来定位,标签名定位,但使用场合十分有限,
# 除非你能确定该标签全局唯一,否则无法进行定位
driver.find_element_by_tag_name("input")
# # 非弃用方法
# driver.find_element(By.TAG_NAME,"input")

for element in elements:
    print(element.text)

time.sleep(4)
driver.quit()

https://cdn2.byhy.net/files/selenium/sample1.html

针对这个html,使用 tag name 定位到内层11,12,21,并打印

import time

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
browser.get('https://cdn2.byhy.net/files/selenium/sample1.html')

# 定位 id 属性
# 限制 选择元素的范围是 id 为 container 元素的内部。
element = browser.find_element(By.ID,'container')

elements = element.find_elements(By.TAG_NAME,'span')
for e in elements:
    print(e.text)

time.sleep(3)
browser.quit()
4) class name 定位

在标签里是指class属性,而在 js 中就是 className

from selenium import webdriver
import time

from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")

# class name 定位
# 需要注意的是,class 标签并不一定唯一,或者说通常会有多组标签的 class 属性相同
# 所以使用 class name 进行定位的时候也是需要注意是否全局唯一
driver.find_element_by_class_name("s_ipt").send_keys("零之使魔")
driver.find_element_by_id("su").click()
# 非弃用方法
# driver.find_element(By.CLASS_NAME,"s_ipt").send_keys("零之使魔")
# driver.find_element(By.ID,"su").click()

time.sleep(4)
driver.quit()

https://cdn2.byhy.net/files/selenium/sample1.html

from selenium import webdriver
from selenium.webdriver.common.by import By

# 创建 WebDriver 实例对象,指明使用chrome浏览器驱动
wd = webdriver.Chrome()

# WebDriver 实例对象的get方法 可以让浏览器打开指定网址
wd.get('https://cdn2.byhy.net/files/selenium/sample1.html')

# 根据 class name 选择元素,返回的是 一个列表
# 里面 都是class 属性值为 animal的元素对应的 WebElement对象
elements = wd.find_elements(By.CLASS_NAME, 'animal')

# 取出列表中的每个 WebElement对象,打印出其text属性的值
# text属性就是该 WebElement对象对应的元素在网页中的文本内容
for element in elements:
    print(element.text)

元素也可以有 多个class类型 ,多个class类型的值之间用 空格 隔开,比如

<span class="chinese student">张三</span>

注意,这里 span元素 有两个class属性,分别 是 chinese 和 student, 而不是一个 名为 chinese student 的属性。

我们要用代码选择这个元素,可以指定任意一个class 属性值,都可以选择到这个元素,如下

element = wd.find_elements(By.CLASS_NAME,'chinese')

或者

element = wd.find_elements(By.CLASS_NAME,'student')

而不能这样写

element = wd.find_elements(By.CLASS_NAME,'chinese student')
5) CSS 定位

通过 find_element_by_css_selector( ) 函数,选择取百度输入框的id 属性来定义 CSS 的获取可以用chrome的F12开发者模式中 Element-右键-copy-copy selector 来获取

from selenium import webdriver
import time

from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")

# 通过 CSS 进行元素定位
driver.find_element_by_css_selector("#kw").send_keys("零之使魔")
driver.find_element_by_css_selector("#su").click()
# 非弃用方法
# driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("零之使魔")
# driver.find_element(By.CSS_SELECTOR,"#su").click()

time.sleep(4)
driver.quit()

例2:

https://cdn2.byhy.net/files/selenium/sample1a.html

我们要选择所有 唐诗里面的作者和诗名, 也就是选择所有 id 为 t1 里面的 span 和 p 元素

我们是不是应该这样写呢?

#t1 > span,p

不行哦,这样写的意思是 选择所有 id 为 t1 里面的 span所有的 p 元素

只能这样写

#t1 > span , #t1 > p

执行自动化代码:

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
browser.get('https://cdn2.byhy.net/files/selenium/sample1a.html')

elements = browser.find_elements(By.CSS_SELECTOR,'#t1 > span , #t1 > p')
for e in elements:
    print(e.text)
    
browser.quit()
6) XPath 定位

XPath 是一种在XML 文档中定位元素的语言。因为HTML 可以看做XML 的一种实现,所以selenium 用户可是使用这种强大语言在web 应用中定位元素。
XPath 扩展了上面id 和name 定位方式,提供了很多种可能性。
XPATH的获取可以用chrome的F12开发者模式中Element-右键-copy-copy xpath来获取

from selenium import webdriver
import time

from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")

# 使用 XPath 定位
# XPath 一定是全局唯一的
driver.find_element_by_xpath("//*[@id='kw']").send_keys("零之使魔")
driver.find_element_by_xpath("//*[@id='su']").click()
# 非弃用方法
# driver.find_element(By.XPATH,"//*[@id='kw']").send_keys("零之使魔")
# driver.find_element(By.XPATH,"//*[@id='su']").click()

time.sleep(4)
driver.quit()
7) link text 定位

有时候不是一个输入框也不是一个按钮,而是一个文字链接,我们可以通过链接内容,也就是 link text 来定位。
需要注意的是链接内容必须这个页面唯一,否则会报错

from selenium import webdriver
import time

from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")

#  link text 定位
# 通过连接内容,来进行定位
driver.find_element_by_link_text("hao123").click()
# 非弃用方法
# driver.find_element(By.LINK_TEXT,"hao123").click()

time.sleep(4)
driver.quit()
8)Partial link text 定位

通过链接部分进行定位,例如上边的hao123

#coding=utf-8
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
browser.find_element_by_partial_link_text("hao").click()
browser.quit()

2.操作测试对象

**webdriver 常用的操作对象的方法: **

  • click 点击对象
  • send_keys 在对象上模拟按键输入
  • clear 清除对象输入的文本内容
  • submit 提交
  • text 用户获取元素的文本信息
  • get_attribute(‘outerHTML’) 获取整个元素对应的HTML文本内容
  • get_attribute(‘value’) 获取输入框中的文本
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

driver =  webdriver.Chrome()
driver.get("https://www.baidu.com")
# send_keys 在对象上模拟按键输入
driver.find_element(By.ID,"kw").send_keys("魔女之旅")
# 点击对象 click()
driver.find_element(By.ID,"su").click()
time.sleep(6)
# 清除百度输入框中的内容
driver.find_element_by_id("kw").clear()
time.sleep(5)

driver.find_element_by_css_selector("#kw").send_keys("零之使魔")
# text 用户获取元素的文本信息
print(driver.find_element_by_css_selector("#kw").text) # 零之使魔
# 提交表单 submit
# driver.find_element(By.CSS_SELECTOR,"#su").click()
driver.find_element(By.CSS_SELECTOR,"#su").submit()

time.sleep(4)
driver.quit()

1)鼠标点击(click)与键盘输入(send_keys)

2)submit 提交表单

3)text 获取元素文本

3.添加等待

为什么需要等待呢?直接看下面的例子

import time

from selenium import webdriver

url = "https://www.baidu.com"
browser = webdriver.Chrome()
browser.get(url)

browser.find_element_by_id("kw").send_keys("平凡之路歌曲")
browser.find_element_by_xpath('//*[@id="su"]').click()
# 点击网页
browser.find_element_by_xpath('//*[@id="1"]/div/div/h3/a/em').click()

browser.quit()

执行脚本,发现报错了,为什么呢?

因为脚本执行过快,页面还没跳转完。在播放前先进行等待几秒,等页面跳转完毕,就能进行下一步操作了。

1)sleep休眠

引入 time 包,就可以在脚本中添加指定的休眠时间了

import time
time.sleep(3) //休眠 3s

再次执行,

import time

from selenium import webdriver

url = "https://www.baidu.com"
browser = webdriver.Chrome()
browser.get(url)

browser.find_element_by_id("kw").send_keys("平凡之路歌曲")
browser.find_element_by_xpath('//*[@id="su"]').click()

# 等待3s后在进行操作
time.sleep(3)

# 点击网页
browser.find_element_by_xpath('//*[@id="1"]/div/div/h3/a/em').click()

browser.quit()
2)隐式等待 implicitly_wait

当发现元素没有找到的时候, 并不立即返回 找不到元素的错误。

而是周期性(每隔半秒钟)重新寻找该元素,直到该元素找到,

或者超出指定最大等待时长,这时才 抛出异常(如果是 find_elements 之类的方法, 则是返回空列表)

selenium.webdriver.remote.webdriver.implicitly_wait(time_to_wait)

使用 implicitly_wait() ,可以实现智能等待.

from selenium import webdriver

# url = "http://8.142.116.177:8080/index.html"
url = "https://www.baidu.com"
browser = webdriver.Chrome()
browser.get(url)

browser.implicitly_wait(30)
browser.find_element_by_id("kw").send_keys("selenium")
browser.find_element_by_xpath('//*[@id="su"]').click()
browser.quit()

执行脚本,可以观察到 implicitly_wait() 并非是固定的等待一个时间,等完才执行,而且在一个时间范围内进行智能的等待。这也是和 time.sleep() 的区别。

隐式地等待并非一个固定的等待时间,当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它以轮询的方式不断的判断元素是否被定位到。直到超出设置的时长

4.浏览器相关信息

1)打印页面信息
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")

# 打印页面的标题
print(driver.title) # 百度一下,你就知道

# 打印url
print(driver.current_url) # https://www.baidu.com/

driver.quit()
2)浏览器的操作
import time
from selenium import webdriver
from selenium.webdriver import ChromeOptions

option = ChromeOptions()
option.add_experimental_option('excludeSwitches',['enable-automation'])
option.add_experimental_option('useAutomationExtension',False)
driver = webdriver.Chrome(options=option)
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{'source':'Object.defineProperty(navigator,"webdriver",{get:()=>undefind})'})
driver.get("https://www.baidu.com")

driver.find_element_by_id("kw").send_keys("零之使魔")
driver.find_element_by_id("su").click()

# 手动设置浏览器窗口大小(宽,高)
driver.set_window_size(800,800)
time.sleep(3)

# 设置浏览器窗口最大化
driver.maximize_window()
time.sleep(3)

# 浏览器后退 (相当于浏览器左上角的<-)
driver.back()
time.sleep(3)

# 浏览器前进 (相当于浏览器左上角的->)
driver.forward()
time.sleep(3)

# 控制浏览器滚动条
# 让滚动条到浏览器底端
js1 = "var q = document.documentElement.scrollTop=10000"
driver.execute_script(js1)
time.sleep(3)
# 让滚动条到浏览器顶端
js2 = "var q = document.documentElement.scrollTop=0"
driver.execute_script(js2)

time.sleep(3)
driver.quit()

5.键盘组合事件

1)键盘按键

要使用键盘按键,需要引入 keys 包

from selenium.webdirver.common.keys import Keys

通过send_keys()调用按键:
send_keys(Keys.TAB) # TAB
send_keys(Keys.ENTER) # 回车
send_keys(Keys.SPACE) #空格键
send_keys(Keys.ESCAPE) #回退键(Esc)

案例: 登录百度账号

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ChromeOptions, Keys

option = ChromeOptions()
option.add_experimental_option('excludeSwitches',['enable-automation'])
option.add_experimental_option('useAutomationExtension',False)
driver = webdriver.Chrome(options=option)
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{'source':'Object.defineProperty(navigator,"webdriver",{get:()=>undefind})'})
driver.get("https://www.baidu.com/")

# 放大浏览器
driver.maximize_window()

# 找到百度网页上的登录按钮,并点击
driver.find_element_by_xpath("//*[@id='s-top-loginbtn']").click()
time.sleep(3)
# 定位到账号输入框
driver.find_element(By.NAME,"userName").send_keys("15207535664")
time.sleep(3)	

# 使用 tap 键,将焦点定位到密码输入框
# name = driver.find_element(By.NAME,"password")
name = driver.find_element(By.XPATH,"//*[@id='TANGRAM__PSP_11__password']")
name.send_keys(Keys.TAB)
time.sleep(3)
# ..输入密码
driver.find_element(By.XPATH,"//*[@id='TANGRAM__PSP_11__password']").send_keys("@jiatenghui.")
time.sleep(3)
# 使用 enter 提交表单
driver.find_element_by_css_selector("#TANGRAM__PSP_11__submit").send_keys(Keys.ENTER)
time.sleep(3)
driver.quit()

注意需要先下载好禅道

2)组合按键:

send_keys(Keys.CONTROL,‘a’) #全选(Ctrl+A)
send_keys(Keys.CONTROL,‘c’) #复制(Ctrl+C)
send_keys(Keys.CONTROL,‘x’) #剪贴(Ctrl+X)
send_keys(Keys.CONTROL,‘v’) #粘贴(Ctrl+V)

import time
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver import ChromeOptions

option = ChromeOptions()
option.add_experimental_option('excludeSwitches',['enable-automation'])
option.add_experimental_option('useAutomationExtension',False)
driver = webdriver.Chrome(options=option)
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{'source':'Object.defineProperty(navigator,"webdriver",{get:()=>undefind})'})
driver.get("https://www.baidu.com")
# 浏览器最大化
driver.maximize_window()
driver.find_element(By.ID,"kw").send_keys("露易丝")
driver.find_element(By.ID,"su").click()
time.sleep(3)

# ctrl+a 全选
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
# ctrl+x 剪切
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
time.sleep(3)

driver.find_element_by_id("kw").send_keys("伊蕾娜")
driver.find_element_by_id("su").click()
time.sleep(3)
driver.quit()

6.鼠标事件

鼠标事件相应工具包:

from selenium.webdriver.common.action_chains import ActionChains  

语法:

ActionChains(驱动变量).context_click(定位到的元素).perform()

ActionChains(driver): 生成用户的行为.所有的行动都存储在 actionchains 对象.通过 perform() 存储的行为.

context_click(): 右击定位到的元素

perform(): 执行所有存储的行为

ActionChains 类

  • context_click() 右击
  • double_click() 双击
  • drag_and_drop() 拖动
  • move_to_element() 移动
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ChromeOptions, ActionChains

# 鼠标事件
option = ChromeOptions()
option.add_experimental_option('excludeSwitches',['enable-automation'])
option.add_experimental_option('useAutomationExtension',False)
driver = webdriver.Chrome(options=option)
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{'source':'Object.defineProperty(navigator,"webdriver",{get:()=>undefind})'})
driver.get("https://www.baidu.com/")

# 浏览器最大化
driver.maximize_window()
driver.find_element_by_id("kw").send_keys("零之使魔")
driver.find_element_by_id("su").click()
time.sleep(3)

# 右击一下百度按钮
locate = driver.find_element_by_id("su")
ActionChains(driver).context_click(locate).perform()
time.sleep(3)

# 双击百度按钮
driver.find_element_by_id("kw").clear()
driver.find_element_by_id("kw").send_keys("伊蕾娜")
time.sleep(3)
btn = driver.find_element_by_id("su")
ActionChains(driver).double_click(btn).perform()
time.sleep(3)
driver.quit()

7.定位一组元素

webdriver 对象可以很方便的使用其 find_Element() 方法来定位某个特定的对象,但如果需要定位不仅限于单个对象,就可以使用find_Elements() 方法

为了方便演示,这里准备了一个 html :

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>定位一组元素</title>
</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>

批量勾选操作:

import os
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
# driver.get("file:///E:/python/test2/614html/test1.html")
url = "file:///"+os.path.abspath("E:/python/test2/614html/test1.html")
driver.get(url)
driver.maximize_window()

time.sleep(3)
inputs = driver.find_elements(By.TAG_NAME,"input")
for input in inputs:
    if input.get_attribute('type') == 'checkbox':
        input.click()
time.sleep(3)
driver.quit()

定位到的元素.get_attribute(属性名): 获取属性值

7.多层框架/窗口定位

对于一个 web 应用,经常会出现框架(frame) 或窗口(window) 的应用

  • 定位一个 frame :switch_to.frame(name_or_id_or_frame_element)
  • 定位一个窗口 window:switch_to.window(name_or_id_or_frame_element)
1)多层框架的定位
  • switch_to.frame(name_or_id_or_frame_element):通过frame的id或者name或者frame自带的其它属性来定位框架,这里switch_to.frame()把当前定位的主体切换了frame里
  • switch_to.default_content():从frame中嵌入的页面里跳出,跳回到最外面的默认页面中

例子:

<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <title>frame</title>
    <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstra
p-combined.min.css" rel="stylesheet" />
    <script type="text/javascript">$(document).ready(function () {
        });
    </script>
<body>
    <div class="row-fluid">
        <div class="span10 well">
            <h3>frame</h3>
            <iframe id="f1" src="inner.html" width="800" , height="600"></iframe>
        </div>
    </div>
</body>
<script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.
    min.js"></script>
</head>

</html>

inner.html:

<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <title>inner</title>
</head>
<body>
    <div class="row-fluid">
        <div class="span6 well">
            <h3>inner</h3>
            <iframe id="f2" src="http://www.baidu.com" width="700" height="500"></iframe>
            <a href="javascript:alert('watir-webdriver better than
selenium webdriver;')">click</a>
        </div>
    </div>
</body>

</html>

在这里插入图片描述

此图为结构

frame1 为默认页面的一个元素,对应 id 为 f1

frame2 是 frame1 框架里面的元素,对应 id 为 f2

执行以下脚本:

from selenium import webdriver
import time
import os

from selenium.webdriver.common.by import By

url = "file:///" + os.path.abspath("E:/python/test2/614html/test2.html")
driver = webdriver.Chrome()
driver.get(url)

# 窗口最大化
driver.maximize_window()
time.sleep(3)
# 通过 frame1 的 id 或者 name 或者 frame1 自带的其它属性来定位框架
driver.switch_to.frame("f1")
driver.find_element(By.LINK_TEXT,"click").click()
time.sleep(3)
driver.quit()

frame1 是 test2.html 默认页面的一个元素,可以通过 switch_to.frame(标签元素) 来定位到,相当于跳转到这个子页面(frame1框架), 而 click 这一链接,是frame1 框架中的一个元素.根据 link_text 定位到这个元素,触发点击事件

像这样,层级框架的缘故,元素的定位会稍微复杂一些.需要注意的是,不能进行越级定位.

例如说, 当前在 frame1 这个框架里,就不能直接定位到 frame2 框架(百度页面) 的元素.必须先跳到 frame2 这个框架,再进行定位其元素.

2)多层窗口的定位

有可能嵌套的不是框架,而是窗口。

还有针对窗口的方法:switch_to.window

用法与switch_to.frame() 相同:driver.switch_to.window("windowName")

切换到新的窗口

如果我们用 Selenium 写自动化程序,在新窗口里面,打开一个新网址,并且自动化操作新窗口里面的元素,会有什么问题呢?

问题就在于,即使新窗口打开了,WebDriver对象对应的 还是老窗口,自动化操作也还是在老窗口进行。

https://cdn2.byhy.net/files/selenium/sample3.html

import time

from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
browser.get('https://cdn2.byhy.net/files/selenium/sample3.html')

# 最大化
browser.maximize_window()

# 点击功能按钮
browser.find_element(By.ID,'outerbutton').click()
# 打印当前窗口标题
print(browser.title)

browser.implicitly_wait(3)
# 点击按钮:访问bing网站
browser.find_element(By.CSS_SELECTOR,'body > a').click()
# 打印当前窗口标题
print(browser.title)

browser.implicitly_wait(3)

# 切换到 bing 这个窗口
# browser.switch_to.window('必应')
for handle in browser.window_handles:
    # 先切换到该窗口
    browser.switch_to.window(handle)
    # 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口
    if 'Bing' in browser.title:
        # 如果是,那么这时候WebDriver对象就是对应的该该窗口,正好,跳出循环,
        break

# 输出当前的窗口title
print(browser.title)

# 在 bing 搜索框输入文字
bing = browser.find_element(By.ID,'sb_form_q')
bing.send_keys('平凡之路')
# 摁下回车键
bing.send_keys(Keys.ENTER)

time.sleep(3)
browser.quit()

这里有处问题,就是如何传参。

先使用 browser.window_handles 获取到一个类似于窗口数组。

然后通过标题判断,选择目标端口

for handle in browser.window_handles:
    # 先切换到该窗口
    browser.switch_to.window(handle)
    # 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口
    if '必应' in browser.title:
        # 如果是,那么这时候WebDriver对象就是对应的该该窗口,正好,跳出循环,
        break

如果要回到原来的窗口,也可以这样。或者提前保存。

# mainWindow变量保存当前窗口的句柄
mainWindow = wd.current_window_handle

切换到老窗口

#通过前面保存的老窗口的句柄,自己切换到老窗口
wd.switch_to.window(mainWindow)

例:多层窗口+多层框架

import time

from selenium import webdriver
from selenium.webdriver import ChromeOptions

# url = "http://8.142.116.177:8080/index.html"
from selenium.webdriver.common.by import By

url = "https://www.baidu.com/"
browser = webdriver.Chrome()
browser.get(url)
browser.maximize_window()
# 如果要安全验证,就要使用这一代码
# option = ChromeOptions()
# option.add_experimental_option('excludeSwitches',['enable-automation'])
# option.add_experimental_option('useAutomationExtension',False)
# browser = webdriver.Chrome(options=option)
# browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{'source':'Object.defineProperty(navigator,"webdriver",{get:()=>undefind})'})
# browser.get("https://www.baidu.com")

browser.find_element_by_id("kw").send_keys("平凡之路歌曲")
browser.find_element_by_xpath('//*[@id="su"]').click()

# 等待3s后在进行操作
time.sleep(3)

# 点击
browser.find_element_by_xpath('//*[@id="1"]/div/div/h3/a/em').click()

# 等待 3s 后在进行操作
browser.implicitly_wait(3)
for handle in browser.window_handles:
    browser.switch_to.window(handle)
    if browser.title == '网易云音乐':
        break

browser.switch_to.frame("g_iframe")

time.sleep(3)

browser.find_element(By.XPATH,'//*[@id="content-operation"]/a[1]').click()


# 设定为播放 60s
time.sleep(60)

browser.quit()

8.alert、confirm、prompt 的处理

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

注意:switch_to.alert()只能处理原生的alert

示例网址: https://cdn2.byhy.net/files/selenium/test4.html

针对 alert 弹出框进行操作

import time

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
browser.get('https://cdn2.byhy.net/files/selenium/test4.html')
browser.maximize_window()
# 点击 alert
browser.find_element(By.ID,'b1').click()
time.sleep(2)
# 获取对象
alert = browser.switch_to.alert

# 获取对话框中的信息内容
print(alert.text)

# 点击确认
alert.accept()

time.sleep(3)
browser.quit()

针对 Confirm 弹出框进行操作

import time

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
browser.get('https://cdn2.byhy.net/files/selenium/test4.html')
browser.maximize_window()
# 点击 alert
browser.find_element(By.ID,'b2').click()
time.sleep(2)
# 获取对象
alert = browser.switch_to.alert

# 获取对话框中的信息内容
print(alert.text)

# 点击确认
alert.accept()

time.sleep(2)
# 再次点击
browser.find_element(By.ID,'b2').click()
time.sleep(2)
# 点击取消
alert.dismiss()

time.sleep(3)
browser.quit()

同 alert 就多个取消按钮

针对 Prompt 弹出框进行操作

import time

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
browser.get('https://cdn2.byhy.net/files/selenium/test4.html')
browser.maximize_window()
# 点击 alert
browser.find_element(By.ID,'b3').click()
time.sleep(2)
# 获取对象
alert = browser.switch_to.alert

# 获取对话框中的信息内容
print(alert.text)
# 输入内容
alert.send_keys('长雨')

alert.accept()

time.sleep(3)
browser.quit()

多个输入内容,sen_keys()

9.上传文件操作

上传过程一般要打开一个本地窗口,从窗口选择本地文件添加。所以,一般会卡在如何操作本地窗口添加上传文件。
其实,在selenium webdriver 没我们想的那么复杂;只要定位上传按钮,通过send_keys 添加本地文件路径就可以了。绝对路径和相对路径都可以,关键是上传的文件存在

upload.html

<!-- 上传文件操作 -->
<html>

<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <title>upload_file</title>
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.min.js">
    </script>
    <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstra
p-combined.min.css" rel="stylesheet" />
    <script type="text/javascript">
    </script>
</head>

<body>
    <div class="row-fluid">
        <div class="span6 well">
            <h3>upload_file</h3>
            <input type="file" name="file" />
        </div>
    </div>
</body>
<script src="http://netdna.bootstrapcdn.com/twitterbootstrap/2.3.2/js/bootstrap.
min.js"></script>

</html>
import time
from selenium import webdriver
import os

driver = webdriver.Chrome()
url = "file:///"+os.path.abspath("E:\\python\\test2\\614html\\test7.html")
driver.get(url)
driver.maximize_window()
time.sleep(2)

# 根据 name 元素进行定位,这里只需要注意全局唯一即可
# 提交文件
driver.find_element_by_name("file").send_keys("E:\\图片\\QQ图片20220607174519.jpg")
time.sleep(3)
driver.quit()

10.选择框

示例html:https://cdn2.byhy.net/files/selenium/test2.html

1)radio 框

选择小雷老师

import time

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
browser.get('https://cdn2.byhy.net/files/selenium/test2.html')

element = browser.find_element(By.CSS_SELECTOR,"#s_radio > input[type=radio]:nth-child(3)")
print('当前选中的是: ' + element.get_attribute('value'))

time.sleep(2)
# 选中
element.click()

time.sleep(3)
browser.quit()
2)checkbox 框

依旧是选择小雷老师,但是需要注意,checkbox 选择后,再次选择会取消。

所以思路是:先把已经选中的选项全部点击一下,然后在点击小雷老师

# 先把 已经选中的选项全部点击一下
elements = wd.find_elements(By.CSS_SELECTOR, 
  '#s_checkbox input[checked="checked"]')

for element in elements:
    element.click()

# 再点击 小雷老师
wd.find_element(By.CSS_SELECTOR, 
  "#s_checkbox input[value='小雷老师']").click()
3)select 框

单选框

import time

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
browser.get("https://cdn2.byhy.net/files/selenium/test2.html")

# 定位单选框
radio = browser.find_element(By.ID,'ss_single')
time.sleep(2)
# 选择元素
radio.find_element(By.CSS_SELECTOR,'#ss_single > option:nth-child(2)').click()
time.sleep(2)
browser.quit()

多选框

# 导入Select类

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from selenium import webdriver
wd = webdriver.Chrome()
wd.get("https://cdn2.byhy.net/files/selenium/test2.html")

# 创建Select对象
select = Select(wd.find_element(By.ID, "ss_multi"))

# 清除所有 已经选中 的选项
select.deselect_all()

# 选择小雷老师 和 小凯老师
select.select_by_visible_text("小雷老师")
select.select_by_visible_text("小凯老师")

[注]部分参考:https://www.byhy.net/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值