selenium等待元素出现(如何使用selenium webdriver来判断一个网页加载完毕)

本文目录
- 如何使用selenium webdriver来判断一个网页加载完毕
- selenium 报错 Element is not clickable at point 常见解决方法
- 怎么等待页面元素加载完成
- selenium显示等待和隐式等待
- Selenium 三种等待方式(强制等待、隐式等待、显示等待)
- selenium 显示等待和隐式等待哪个更好
- selenium显示等待和隐式等待的区别
- selenium之webdriver详解——小白进阶之路(二)
如何使用selenium webdriver来判断一个网页加载完毕
可以设置页面等带webdriverWait,你要先知道页面加载完成,会出现什么元素,然后等待这个元素出现,就认为网页加载完毕~。下面以搜索百度,加载完成会出现‘百度一下,你就知道’,等待出现‘百度一下,你就知道’,就认为加载完成,可以下一步操作~
public static void main(String args) throws IOException, InterruptedException {
System.setProperty("webdriver.gecko.driver", "c:\\browserdriver\\geckodriver.exe");
WebDriver dr =new FirefoxDriver();
***隐藏网址***
dr.findElement(By.id("kw")).sendKeys("百度");
dr.findElement(By.id("su")).click();
String oldHandle=dr.getWindowHandle();
WebDriverWait wait=new WebDriverWait(dr, 5);
wait.until(ExpectedConditions.presenceOfElementLocated(By.linkText("百度一下,你就知道")));
dr.findElement(By.linkText("百度一下,你就知道")).click();
selenium 报错 Element is not clickable at point 常见解决方法
使用Selenium时,触发点击事件,经常报如下异常:
一般常见的如下四种方法:
原因一:对象未加载
说 明: 没加载出来就等待元素加载出来,再往下执行往往就会报错
解决方案:
原因二:当前页面存在frame/iframe,查找的对象不在当前frame/iframe下面
说 明: 如果元素不在当前frame/iframe里,在窗口里找是找不到frame/iframe下的元素的,所以更是无法相关操作的
解决方案: 需要要切换到i元素所在的frame/iframe里去找元素
原因三:不在视窗里
说明: 不在当前可视化的页面中
解决方案: 需要需要拉滚动条 或设置浏览器默认打开大小
原因四:要点击的元素被覆盖
解决方案: 可以使用事件链来解决
例如下拉菜单,通过hover,让子菜单显示,就可以点击了。
关于事件链详情,请点击文档。
部分参考参考 CSDN
***隐藏网址***
怎么等待页面元素加载完成
在selenium-webdriver中我们用两种方式进行等待:明确的等待和隐性的等待。
明确的等待
明确的等待是指在代码进行下一步操作之前等待某一个条件的发生。最不好的情况是使用Thread.sleep()去设置一段确认的时间去等待。但为什么说最不好呢?因为一个元素的加载时间有长有短,你在设置sleep的时间之前要自己把握长短,太短容易超时,太长浪费时间。selenium webdriver提供了一些方法帮助我们等待正好需要等待的时间。利用WebDriverWait类和ExpectedCondition接口就能实现这一点。
下面的html代码实现了这样的一种效果:点击click按钮5秒钟后,页面上会出现一个红色的div块。我们需要写一段自动化脚本去捕获这个出现的div,然后高亮之。
Wait.html
《html》
《head》
《title》Set Timeout《/title》
《style》
.red_box {background-color: red; width = 20%; height: 100px; border: none;}
《/style》
《script》
function show_div(){
setTimeout("create_div()", 5000);
}
function create_div(){
d = document.createElement(’div’);
d.className = "red_box";
document.body.appendChild(d);
}
《/script》
《/head》
《body》
《button id = "b" nclick = "show_div()"》click《/button》
《/body》
《/html》
下面的代码实现了高亮动态生成的div块的功能:
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
public class WaitForSomthing {
/**
* @author gongjf
*/
public static void main(String args) {
// TODO Auto-generated method stub
System.setProperty("webdriver.firefox.bin","D:\\Program Files\\Mozilla Firefox\\firefox.exe");
WebDriver dr = new FirefoxDriver();
String url = "file:///C:/Documents and Settings/gongjf/桌面/selenium_test/Wait.html";// "/Your/Path/to/Wait.html"
dr.get(url);
WebDriverWait wait = new WebDriverWait(dr,10);
wait.until(new ExpectedCondition《WebElement》(){
@Override
public WebElement apply(WebDriver d) {
return d.findElement(By.id("b"));
}}).click();
WebElement element = dr.findElement(By.cssSelector(".red_box"));
((JavascriptExecutor)dr).executeScript("arguments.style.border = \"5px solid yellow\"",element);
}
}
上面的代码WebDriverWait类的构造方法接受了一个WebDriver对象和一个等待最长时间(10秒)。然后调用until方法,其中重写了ExpectedCondition接口中的apply方法,让其返回一个WebElement,即加载完成的元素,然后点击。默认情况下,WebDriverWait每500毫秒调用一次ExpectedCondition,直到有成功的返回,当然如果超过设定的值还没有成功的返回,将抛出异常。
隐性等待
隐性等待是指当要查找元素,而这个元素没有马上出现时,告诉WebDriver查询Dom一定时间。默认值是0,但是设置之后,这个时间将在WebDriver对象实例整个生命周期都起作用。上面的代码就变成了这样:
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
public class WaitForSomthing {
/**
* @author gongjf
*/
public static void main(String args) {
// TODO Auto-generated method stub
System.setProperty("webdriver.firefox.bin","D:\\Program Files\\Mozilla Firefox\\firefox.exe");
WebDriver dr = new FirefoxDriver();
//设置10秒
dr.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
String url = "file:///C:/Documents and Settings/gongjf/桌面/selenium_test/Wait.html";// "/Your/Path/to/Wait.html"
dr.get(url);
//注释掉原来的
/*WebDriverWait wait = new WebDriverWait(dr,10);
wait.until(new ExpectedCondition《WebElement》(){
@Override
public WebElement apply(WebDriver d) {
return d.findElement(By.id("b"));
}}).click();*/
dr.findElement(By.id("b")).click();
WebElement element = dr.findElement(By.cssSelector(".red_box"));
((JavascriptExecutor)dr).executeScript("arguments.style.border = \"5px solid yellow\"",element);
}
}
两者选其一,第二种看起来一劳永逸呀。哈哈
selenium显示等待和隐式等待
接上篇
1. 显示等待
每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常(TimeoutException)
操作格式: WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
WebDriverWait()一般由until()或 until_not()方法配合使用
until(method, message=’ ’) :调用该方法提供的驱动程序作为一个参数,直到返回值为True
until_not(method, message=’ ’) :调用该方法提供的驱动程序作为一个参数,直到返回值为False
在本例中,通过as关键字将expected_conditions重命名为EC,并调用presence_of_element_located()方法判断元素是否存在。
expected_conditions类提供的预期条件判断的方法
2. 隐式等待
隐式等待是通过一定的时长等待页面上某个元素加载完成。如果超出了设置的时长元素还没有被加载,则抛出NoSuchElementException异常。它的作用范围就是Webdriver对象实例的整个生命周期。
3. 强制等待
有时候我们希望脚本在执行到某一位置时暂停一段时间等待页面加载,这时可以使用sleep()方法。
sleep()方法会固定休眠一定的时长,然后再继续执行。sleep()方法默认参数以秒为单位。
Selenium 三种等待方式(强制等待、隐式等待、显示等待)
缺点: 由于Web加载的速度取决于测试的硬件、网速、服务器的响应时间等因素。如果等待时间太长,容易造成时间浪费,如果等待时间太短又可能会造成在web还没有加载完所需要定位的element,而出现报错。
由于等待时间无法确定,使用太多的sleep会影响运行速度,大大地降低效率,所以建议测试中尽量少使用强制等待。
简介: 隐式等待是全局的是针对所有元素,设置等待时间如10秒,如果10秒内出现,则继续向下,否则抛异常。可以理解为在10秒以内,不停刷新看元素是否加载出来。
使用场景: 隐式等待只需要声明一次,一般在打开浏览器后进行声明。声明之后对整个drvier的生命周期都有效,后面不用重复声明。隐式等待存在一个问题,那就是程序会一直等待整个页面加载完成,也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步,但有时候页面想要的元素早就在加载完成了,但是因为个别js之类的东西特别慢,仍得等到页面全部完成才能执行下一步。
简介: 显示等待是单独针对某个元素,设置一个等待时间如5秒,每隔0.5秒检查一次是否出现,如果在5秒之前任何时候出现,则继续向下,一般需要配合该类的 until() 和 until_not() 方法一起用,直到超过设置的最长时间,然后抛出超时错误 TimeoutException ,以下介绍几个最常用的方法:
1. 判断element是否可见:visibility_of_element_located(locator) (可见代表element非隐藏,并且element宽和高都不等于 0)
2. 判断某个element是否被加载到dom树:presence_of_element_located(locator) (并不代表该element一定可见)
3. 判断某个element中是否可见并且可点击:element_to_be_clickable(locator)
4. 判断某个element是否被选中:element_to_be_selected(element) (一般用在下拉列表)
selenium 显示等待和隐式等待哪个更好
显式等待是,先于代码的继续执行,而定义的等待某个条件发生的代码。最糟糕的情况是Thread.sleep(),设置条件为一个需要等待的精确时间段。有一些提供的便利方法,可以帮助你编写代码仅仅等待需要的时间。WebDriverWait与ExpectedCondition的结合是一种可以完成这个目标的方式。
隐含等待,其实就相当于设置全局的等待,在定位元素时,对所有元素设置超时时间。
一般来说,我们使用显式等待。
selenium显示等待和隐式等待的区别
selenium显示等待和隐式等待的区别
1、隐式等待
隐式等待,就是在创建driver时,设置全局元素等待超时时间。当要查找元素,而这个元素没有马上出现时,告诉 WebDriver 查询 Dom 一定时间,实际上浏览器会在你自己设定的时间内不断的刷新页面去寻找我们需要的元素。默认值是 0,但是设置之后,这个时间将在WebDriver 对象实例整个生命周期都起作用。(处理 Table 对象时,需要将此设置为默认值)
设置等待时长为10秒,首先这10秒并非一个固定的等待时间,它并不影响脚本的执行速度。其次,它并不针对页面上的某一元素进行等待。当脚本执行到某个元素定位是,如果元素可以定位,则继续执行,如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到。假设在第六秒定位到了元素则继续执行,若直到超出设置的时长10秒还没有定位到元素,则抛出异常。
2、显示等待
每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常(TimeoutException)
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
driver:浏览器驱动
timeout:最长超时时间,默认以秒为单位
poll_frequency:检测的间隔(步长)时间,默认为0.5S
ignored_exceptions:超时后的异常信息,默认情况下抛NoSuchElementException异常
WebDriverWait()一般由until()或 until_not()方法配合使用
until(method, message=’ ’):调用该方法提供的驱动程序作为一个参数,直到返回值为True
until_not(method, message=’ ’):调用该方法提供的驱动程序作为一个参数,直到返回值为False
selenium之webdriver详解——小白进阶之路(二)
笔记:
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 弹窗,需要用到switch_to.alert来切换弹窗,并对弹窗进行输入信息,关闭等处理。
switch_to.alert.text --获取弹窗文本信息
switch_to.alert.accept() --点击弹窗中确定按钮
switch_to.alert.dismiss() --点击弹出中取消按钮
switch_to.alert.sendKeys("字符串") --在弹窗中输入信息
实例:
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))

更多文章:
directive vue(如何在Vue中建立全局引用或者全局命令)
2026年5月6日 19:15
javaeclipse包的新建(用eclipse如何创建java工程)
2026年1月11日 08:30
c语言switch语句case后面接什么(c语言switch语句中case后面必须要接整型常量和字符型常量吗)
2025年10月26日 08:15
怎么把普通文件导入变成web项目(java项目怎么转成web项目)
2025年9月18日 16:00
在循环体内使用break语句(在循环结构中使用break语句,退出的是一层循环,还是多重循环呢可以给出一个简单且巧妙的例子吗)
2026年5月1日 00:00
position在css的属性(CSS中position属性详解)
2025年9月26日 23:45
amazed是什么牌子(amazing和amazed有什么区别)
2026年4月3日 15:00
周期函数值域的求法(已知函数的最小正周期为求;当时,求函数的值域.)
2025年11月30日 22:15
毕设做网站必须要用到ssm框架嘛(毕业设计做ssm还是app更难)
2026年3月31日 03:00
new directory(如何将威纶通tk6070ip触摸屏程序上传到电脑里)
2026年8月7日 01:45















