案例描述

  • https://www.healthsmart.com.hk/hs-home/#!/link/home
  • 来着学员咨询
  • 这个网页你手工打开的时候你会发现一直处于加载中,一定时间后才好。
  • 我们的需求是点击会员,弹出菜单,进行下一步操作,如果没有加载好点击是无效的(可以点,但无法弹出页面)。

  • 我们来看看代码怎么写

示例代码1:时间去哪里了

from selenium import webdriver
driver = webdriver.Chrome()
from time import ctime
print(ctime())
driver.get('https://www.healthsmart.com.hk/hs-home/#!/link/home')
print(ctime())
  • 执行结果:实际等待了22秒

    Tue Aug 23 10:16:33 2022
    Tue Aug 23 10:16:55 2022
  • 这里有个细节:selenium的get是会等待网页加载完毕的。以下在console可以看到

    # 加载过程中
    document.readyState
    'interactive' # 网页上的X变成圈,加载完毕
    document.readyState
    'complete'

示例代码2:如何有效点击

直接点

from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.healthsmart.com.hk/hs-home/#!/link/home')
driver.find_element('id','NavMember').click() #NavMember 是会员的li的id的值,可以点击的
  • 执行效果是:没有任何效果
  • 这就很奇怪,你已经知道了上面的get是会等待页面加载完毕的,click发生在加载完毕后应该没问题
  • 事实却是不可以的。
  • 通常这个时候你会想到显式等待,但显式等待的那么多已有的方法,你可以去试试,可能没有一个是适合的(你要深入去理解显式等待),为何呢?因为这个元素它就是存在的,你如果点击它要产生新的菜单,需要底层的代码配合(底层的js实现,但为何不算在加载中,要前端来解释了)。
  • 所以单纯的显式等待无法解决这个问题。

显式等待点

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get('https://www.healthsmart.com.hk/hs-home/#!/link/home')
ele_huiyuan = 'id','NavMember'
WebDriverWait(driver,5,0.5).until(EC.visibility_of_element_located(ele_huiyuan)).click()
  • 一样的没有任何效果

强制等待点

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get('https://www.healthsmart.com.hk/hs-home/#!/link/home')
ele_huiyuan = 'id','NavMember'
from time import sleep
sleep(1)
WebDriverWait(driver,5,0.5).until(EC.visibility_of_element_located(ele_huiyuan)).click()
  • 很有意思的事发生了,点击出来了。
  • 好像是加载了之后,那个底层的代码没有立即生效(就绪),你等会再点击就可以了。
  • 但是,sleep总是不太可靠的,万一它2秒后才就绪呢?

轮询等待原始实现

  • 现在我们大概知道,这个登记会员元素的元素在点击会员后会产生,那就意味着,如果没有它,我每隔1s就点会员,就可以达到我要的效果

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get('https://www.healthsmart.com.hk/hs-home/#!/link/home')
from time import time,sleep start_time = time() # 定义开始时间
timeout = 5 # 定义超时时间
poll_frequency = 0.5 # 定义轮询时间
end_time = start_time + timeout # 定义结束时间
while True:
driver.find_element('id','NavMember').click() # 点击
try:
if driver.find_element('link text','登記會員'): #看有无这个元素,如果有,跳出循环 ,如果没有,异常了
driver.find_element('link text', '登記會員').click()
print('找到了登记会员')
break
except:
sleep(poll_frequency) # 等待 轮询时间
if time()>=end_time: # 如果超过了结束时间
print('超时了')
break # 也终止
  • 这样做是可以的,但是如果熟悉显式等待的同学就知道,这部分其实几乎就是显式的源码实现
  • 那我们依样画葫芦来实现下。

自定义显式等待条件的实现方式

  • 下面的写法你要对显式等待比较了解方可
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
driver.get('https://www.healthsmart.com.hk/hs-home/#!/link/home') def find_huiyuan():
def _predicate(driver):
try:
driver.find_element('id','NavMember').click()
return driver.find_element('link text','登記會員')
except :
return False return _predicate WebDriverWait(driver,5,0.5).until(find_huiyuan()).click()
  • 当然我在这里也没有过度封装,find_huiyuan可以再做好一点,这个就留给大家了。

FAQ selenium无法click的一个案例分享(2)的更多相关文章

  1. nginx端口占用案例分享

    这里分享一个案例,问题的原因是反向代理使用不当. 现象 首先描述一下问题的现象.当时的问题是应用启动失败,日志里面报错显示端口占用.我们的应用都是通过脚本发布的,之前发布过多次都没有出现过问题.那么同 ...

  2. Office 2010 KMS激活原理和案例分享

    Office 2010 KMS激活原理和案例分享     为了减低部署盗版(可能包含恶意软件.病毒和其他安全风险)的可能性,Office 2010面向企业客户推出了新的批量激活方式:KMS和MAK.这 ...

  3. Office 2010 KMS激活原理和案例分享 - Your Office Solution Here - Site Home - TechNet Blogs

    [作者:葛伟华.张玉工程师 ,  Office/Project支持团队, 微软亚太区全球技术支持中心 ] 为了减低部署盗版(可能包含恶意软件.病毒和其他安全风险)的可能性,Office 2010面向企 ...

  4. 性能调优案例分享:Mysql的cpu过高

    性能调优案例分享:Mysql的cpu过高   问题:一个系统,Mysql数据库,数据量变大之后.mysql的cpu占用率很高,一个测试端访问服务器时mysql的cpu占用率为15% ,6个测试端连服务 ...

  5. 老李案例分享:MAT分析应用程序服务出现内存溢出过程

    老李案例分享:MAT分析应用程序服务出现内存溢出过程   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的loa ...

  6. 老李案例分享:定位JAVA内存溢出

    老李案例分享:定位JAVA内存溢出   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的loadrunner的培 ...

  7. 性能调优案例分享:jvm crash的原因 1

    性能调优案例分享:jvm crash的原因   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq: ...

  8. Vue一个案例引发「内容分发slot」的最全总结

    今天我们继续来说说 Vue,目前一直在自学 Vue 然后也开始做一个项目实战,我一直认为在实战中去发现问题然后解决问题的学习方式是最好的,所以我在学习一些 Vue 的理论之后,就开始自己利用业余时间做 ...

  9. [转载]DevOps在传统企业的落地实践及案例分享

    内容来源:2017年6月10日,优维科技高级解决方案架构师黄星玲在“DevOps&SRE 超越传统运维之道”进行<DevOps在传统企业的落地实践及案例分享>演讲分享.IT 大咖说 ...

  10. mysql的"双1设置"-数据安全的关键参数(案例分享)

    mysql的"双1验证"指的是innodb_flush_log_at_trx_commit和sync_binlog两个参数设置,这两个是是控制MySQL 磁盘写入策略以及数据安全性 ...

随机推荐

  1. 写一个shell,自动执行jmeter测试脚本

    贡献一个自己写的shell脚本,很简单,但又可以高效率的自动执行jmeter压测脚本. #!/bin/bash #author:zhangyl #version:V1 #该脚本放置于压测脚本的上一层目 ...

  2. Swagger的介绍

    一.Swagger是什么? Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务. 二.Swagger 的优势? 支持 API 自动生成同步的在线 ...

  3. 2022春每日一题:Day 30

    题目:[JSOI2009]电子字典 读完题后,暴力?确实,计算一下时间复杂度最坏情况下,20263*10000=1.5e8,卡一下常可以直接卡到7e7,最严格来说应该卡的过去,但是此题数据可以直接卡过 ...

  4. 【Java并发004】原理层面:synchronized关键字全解析

    一.前言 synchronized关键字在需要原子性.可见性和有序性这三种特性的时候都可以作为其中一种解决方案,看起来是"万能"的.的确,大部分并发控制操作都能使用synchron ...

  5. [CG] 用 Docker 配置 Ubuntu OpenGL 环境

    成功在 MacOS 的 Docker 中运行 OpenGL 程序并显示这里记录一下: 我用的是 https://hub.docker.com/r/thewtex/opengl 这个镜像非常好,大部分工 ...

  6. day31-JQuery04

    JQuery04 6.jQuery的DOM操作02 6.9常用遍历节点方法 取得匹配元素的所有子元素组成的集合:children(),该方法只考虑子元素而不考虑任何后代元素 取得匹配元素后面的同辈元素 ...

  7. 12V转5V降压芯片,12V转3.3V稳压芯片电路图

    12V转5V应用中,大多要求会输出电流高的,稳压LDO就不能满足了,需要使用DC-DC降压芯片来持续稳压5V,输出电流1000MA,2000MA,3000MA,5000MA等.不同的输出电流可以选择适 ...

  8. 关于Mybatis-Plus中update()、updateById()方法的使用及null值的判断

    使用场景说明: 在 Mybatis-Plus 的使用过程中,经常会遇对数据库更新的情况 更新常用方法:update().updateById() 问题:经常会遇见对 null 值的处理,对传入的实体参 ...

  9. 一键部署MySQL8+keepalived双主热备高可用

    概述 本次的文章会格外的长,网上大多的配置流程已经不可使用,本篇文章可以称为保姆级教程,而且通过shell脚本大大减少了部署mysql主从,双主的工作量. 如上图,VIP地址为192.168.10.1 ...

  10. Window系统的mysql数据库定时备份

    原文:Window系统的mysql数据库定时备份 - Stars-One的杂货小窝 最近老大提到了数据库备份的功能,由于服务器是window系统的,所以研究了下备份的方案,特此记录 主要是实现每天定时 ...