selenium之webdriver详解——小白进阶之路(二)

selenium之webdriver详解——小白进阶之路(二),第1张

笔记:

01.设置元素等待时间

自动化测试的时候,元素定位没有错,但是跑脚本的时候却报错了

例如,登录的时候要等登录页面加载出来才能输入用户名和密码

selenium设置元素等待时间的3种方式及区别

1.sleep() --固定等待时间:强制等待,不能把握准确的等等时间,适合调试时用

2.implicitly_wait() --隐式等待时间:等页面加载完成才执行下一步 *** 作,一般设置一次即可

3.WebDriverWait --显示等待时间:配合untill()和not untill()方法,根据判断条件 灵活处理等待时间

要先设置一个超长时间,在这个时间内,程序根据调用频率每隔几秒查看一下,如果条件满足,则执行下一步 *** 作,若不满足且超过了等待时间则抛出异常

导包:from selenium.webdriver.support.ui import WebDriverWait

使用:WebDriverWait(driver, 超时时间, 调用频率, 要忽略的异常).until(要执行的方法, 超时时返回的错误信息)

实例:

replace:

02.键盘事件Keys类

制表符:send_keys(Keys.TAB)

退出键:send_keys(Keys.ESCAPE)

F1:send_keys(Keys.F1)   f1~f12 以此类推

03.二次定位

顾名思义,通过多个元素,定位两次

dr.find_element(By.CLASS_NAME,"s_input").send_keys("python")

二次定位:

dr.find_element(By.NAME,"query").find_element(By.CLASS_NAME,"s_input").send_keys("python")

04.selenium鼠标悬停类-- ActionChains()

导包:from selenium.webdriver.common.action_chainsimport ActionChains

实例:将鼠标移动至更多设置,悬停鼠标

elem1= dr.find_element(By.LINK_TEXT,"设置")

ActionChains(dr).move_to_element(elem1).perform()

05.selenium警告框的处理

很多web应用经常会遇到JavaScript编写的alert 、confirm 以及prompt d窗,需要用到switch_to.alert来切换d窗,并对d窗进行输入信息,关闭等处理。

switch_to.alert.text  --获取d窗文本信息

switch_to.alert.accept()  --点击d窗中确定按钮

switch_to.alert.dismiss()  --点击d出中取消按钮

switch_to.alert.sendKeys("字符串")  --在d窗中输入信息

实例:

06.下拉菜单选择的三种方式

导包:from selenium.webdriver.support.uiimport Select

#选择下拉框的o2

elem1 = dr.find_element(By.ID,"s3Id")

1:根据value值定位

Select(elem1).select_by_value("o2val")

2.根据index定位

Select(elem1).select_by_index(1)

3.根据下拉框文本信息定位

Select(elem1).select_by_visible_text("o2")

07.多窗口切换

window_handles --获取所有窗口句柄

switch_to.window(指定窗口) --切换到指定窗口

08.selenium之JS *** 作浏览器滚动条位置

execute_script("window.scrollTo(0,n)")

09.selenium之JS *** 作隐藏元素

隐藏元素的标识:style="display:none"

一般我们通过将隐藏元素的属性修改成显示再定位

10. *** 作excel文件

将测试数据参数化用到

10.1准备参数化数据文件

10.2导包

打开文件,填写文档路径

运行结果:

定位到sheet的位置

读取sheet的行和列的内容

#读取表的行的方法

rows = sheet1.nrows

print("行数",rows)

columns = sheet1.ncols

print("列数",columns)

读取指定行的值

#读取指定行的值

rowValue1 = sheet1.row_values(0)

print(rowValue1)

#读取指定列的值

colValue1 = sheet1.col_values(0)

print(colValue1)

#输出所有用户名和对应的密码

for iin range(1,rows):

print("用户名:" + sheet1.row_values(i)[0] +",密码:" + sheet1.row_values(i)[1])

这种情况可能是由于在发送信息时没有正确地定位消息输入框,导致程序将整段信息分为多个部分进行发送。您可以尝试以下方法解决问题:

1. 确认定位元素是否正确:使用 Selenium 定位消息输入框时,需要确保定位的元素是唯一的,并且包含了整段要发送的信息。

2. 将整段信息作为一个字符串变量传递给 send_keys() 方法:在调用 send_keys() 方法时,应该将整段信息作为一个字符串参数传递,而不是将其拆分成多个部分进行迭代发送。

3. 增加等待时间:有些网页在加载和响应速度上可能会存在一定差异,如果在消息输入框加载完成前就开始发送信息,可能会导致信息被分割发送。因此,在使用 send_keys() 方法发送信息前,建议先增加等待时间,以确保消息输入框已经完全加载并准备好接收信息。

示例代码如下所示:

```python

from selenium import webdriver

import time

# 创建浏览器实例

driver = webdriver.Chrome()

# 打开目标页面

driver.get('https://example.com')

# 等待页面加载完成

time.sleep(5)

# 定位消息输入框

input_box = driver.find_element_by_css_selector('#message-input')

# 发送整段信息(假设 message 变量中存储了要发送的信息)

message = 'Hello, world!'

input_box.send_keys(message)

# 等待 3 秒后关闭浏览器

time.sleep(3)

driver.quit()

```

注意,以上示例代码仅供参考,具体实现方式可能因网页结构、浏览器版本等因素而异。

单选比较好 *** 作,先定位需要单选的某个元素,然后点击一下即可。

多选好像也比较容易,依次定位需要选择的元素,点击即可。

下拉框的 *** 作相对复杂一些,需要用到Select模块。

先导入该类

在select模块中有以下定位方法

测试页面

然后,再演示下拉框的不同选择的方式

Selenium打开一个页面之后,默认是在父页面进行 *** 作,此时如果这个页面还有子页面,想要获取子页面的节点元素信息则需要切换到子页面进行擦走,这时候switch_to.frame()就来了。如果想回到父页面,用switch_to.parent_frame()即可。

既然是模拟浏览器 *** 作,自然也就需要能模拟鼠标的一些 *** 作了,这里需要导入ActionChains 类。

左键

这个其实就是页面交互 *** 作中的点击click() *** 作。

右键

context_click()

在上述 *** 作中

双击

double_click()

drag_and_drop(source,target)拖拽 *** 作嘛,开始位置和结束位置需要被指定,这个常用于滑块类验证码的 *** 作之类。

selenium中的Keys()类提供了大部分的键盘 *** 作方法,通过send_keys()方法来模拟键盘上的按键。

引入Keys类

常见的键盘 *** 作

send_keys(Keys.BACK_SPACE):删除键(BackSpace)

send_keys(Keys.SPACE):空格键(Space)

send_keys(Keys.TAB):制表键(TAB)

send_keys(Keys.ESCAPE):回退键(ESCAPE)

send_keys(Keys.ENTER):回车键(ENTER)

send_keys(Keys.CONTRL,'a'):全选(Ctrl+A)

send_keys(Keys.CONTRL,'c'):复制(Ctrl+C)

send_keys(Keys.CONTRL,'x'):剪切(Ctrl+X)

send_keys(Keys.CONTRL,'v'):粘贴(Ctrl+V)

send_keys(Keys.F1):键盘F1

send_keys(Keys.F12):键盘F12

实例 *** 作演示:

定位需要 *** 作的元素,然后 *** 作即可!

如果遇到使用ajax加载的网页,页面元素可能不是同时加载出来的,这个时候尝试在get方法执行完成时获取网页源代码可能并非浏览器完全加载完成的页面。所以,这种情况下需要设置延时等待一定时间,确保全部节点都加载出来。

等待有三种方式:强制等待、隐式等待和显式等待

1.强制等待

直接time.sleep(n)强制等待n秒,在执行get方法之后执行。

2.隐式等待

implicitly_wait()设置等待时间,如果到时间有元素节点没有加载出来,就会抛出异常。

3. 显式等待

设置一个等待时间和一个条件,在规定时间内,每隔一段时间查看下条件是否成立,如果成立那么程序就继续执行,否则就抛出一个超时异常。

WebDriverWait的参数说明:

WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)

driver: 浏览器驱动

timeout: 超时时间,等待的最长时间(同时要考虑隐性等待时间)

poll_frequency: 每次检测的间隔时间,默认是0.5秒

ignored_exceptions:超时后的异常信息,默认情况下抛出NoSuchElementException异常

until(method,message='')

method: 在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False

message: 如果超时,抛出TimeoutException,将message传入异常

until_not(method,message='')

until_not 与until相反,until是当某元素出现或什么条件成立则继续执行,until_not是当某元素消失或什么条件不成立则继续执行,参数也相同。

其他等待条件

还有一些 *** 作,比如下拉进度条,模拟javaScript,使用execute_script方法来实现。

在selenium使用过程中,还可以很方便对Cookie进行获取、添加与删除等 *** 作。

输出:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/8024683.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存