元素操作(一)

1|0一. 如何处理首次登陆的引导页面


refresh():页面刷新。可以再浏览器中刷新一下,就可以取消引导页

2|0二. 操作页面弹出框中的元素


2|11. 强制等待 sleep(秒)


比如百度首页的登录弹出框,在访问百度的时候,它就在html页面中出现了,只不过默认display:none,没有展示而已(这种弹出框只是修改display属性为block,所以系统响应应该非常快),对于这种情况,需要等待弹出框出现,才能进行下一步操作,所以需要设置等待时间

访问百度首页登录代码如下:

from selenium import webdriver import time #初始化chromedriver driver = webdriver.Chrome() #驱动浏览器访问百度首页 driver.get("http://www.baidu.com") #利用xpath定位百度首页的登录,并点击 driver.find_element_by_xpath("//*[@id='u1']//a[@name='tj_login']").click() #强制等待2s time.sleep(2) #利用id定位用户名登录,并点击 driver.find_element_by_id("TANGRAM__PSP_10__footerULoginBtn").click()

还有一种情况,提交表单数据后,会看到一个进度条,这意味着系统正与服务器进行交互,只有交互之后,才能看到页面的变化。这时候,就不能确定加载时间是多少,因为和网络、服务器的性能有关。这里就要用到隐性等待

2|22. 隐性等待 implicitly_wait(秒)


设置最长等待时间,在这个时间内加载完成,则执行下一步,比如设置30s隐性等待,在3s内就能切换到页面,就不会再继续等下去,而是进入下一步

整个driver的会话(从建立连接到断开连接 )周期内,设置一次即可,全局都可用

 

继续用上面的例子做修改,修改后的百度登录代码如下:

from selenium import webdriver #初始化chromedriver,建立连接 driver = webdriver.Chrome() #隐性等待30s,应该在建立连接之后设置 driver.implicitly_wait(30) #驱动浏览器访问百度首页 driver.get("http://www.baidu.com") #利用xpath定位百度首页的登录,并点击 driver.find_element_by_xpath("//*[@id='u1']//a[@name='tj_login']").click() #利用id定位用户名登录,并点击 driver.find_element_by_id("TANGRAM__PSP_10__footerULoginBtn").click() #断开连接,必须用driver.quit()而非close() #driver.quit()

注意:观察到当python脚本运行结束时,进程中的chromedriver.exe会消失,但这并不意味着会话的结束,一个会话的结束是以关闭浏览器,断开连接为标准的(chromedriver.exe进程,在会话当中很重要,是一部分,但并不是全部。所以即便chromedriver.exe没了,会话仍然没有正确结束。因为除了启动chromedriver.exe之外,还有其它初始化的配置项)

另一种更高级的情况是,我在百度里搜索"selenium",需要等到另外一个页面的弹出框出现之后,才会对它进行操作,这时需要用到显性等待

 

 

 

2|33. 显性等待


明确等到某个条件满足之后,再去执行下一步的操作

程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException

 

WebDriverWait类:显性等待类

WebDriverWait(driver, 等待时长, 轮询周期).until/until_not

  • driver:表示本次会话中的driver

  • 等待时长:最长的等待时间

  • 轮询周期:多久去看一眼

  • until:直到条件成立;until_not:直到条件不成立

 

Expected_conditions类:提供了一系列周期发生的条件

presence_of_element_located:元素存在

visibility_of_element_located:元素可见

element_to_be_clickable:元素可点击

ps:这个类有很多判断方法,具体自行了解

 

使用之前,引入相关的库:

from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By

使用方法:

1) 先确定元素的定位表达式   web_locator='XXXX'

2) 调用WebDriverWait类设置等待总时长、轮询周期,并调用其until、until_not方法

WebDriverWait(webdriver对象名, 等待总时长, 轮询周期).until(判断条件)

3) 使用expected_conditions对应的方法来生成判断条件

EC.方法名((定位方式, 定位表达式))

如:EC.presence_of_element_located((By.CSS_SELECTOR, web_locator))

 

继续修改上面的代码,如下所示:

from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By #初始化chromedriver,建立连接 driver = webdriver.Chrome() #驱动浏览器访问百度首页 driver.get("http://www.baidu.com") #利用xpath定位百度首页的登录,并点击 driver.find_element_by_xpath("//*[@id='u1']//a[@name='tj_login']").click() #1. 先确定要找的元素的表达式 2.设置WebDriverWait类的参数和条件 login_popup_id = "TANGRAM__PSP_10__footerULoginBtn" WebDriverWait(driver, 10, 1).until(EC.visibility_of_element_located((By.ID, login_popup_id))) #元素可见的话再点击 driver.find_element_by_id(login_popup_id).click()

 


__EOF__

本文作者cnhkzyy
本文链接https://www.cnblogs.com/my_captain/p/9235233.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   cnhkzyy  阅读(327)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2017-06-27 《Advanced Bash-scripting Guide》学习(八):从一个目录移动整个目录树到另一个目录
点击右上角即可分享
微信分享提示