首页 > 其他分享 >selenium无法click的一个案例分享(2)

selenium无法click的一个案例分享(2)

时间:2022-08-23 13:25:28浏览次数:80  
标签:webdriver selenium driver 案例 home import click

案例描述

  • 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可以再做好一点,这个就留给大家了。

标签:webdriver,selenium,driver,案例,home,import,click
From: https://www.cnblogs.com/wuxianfeng023/p/16615785.html

相关文章

  • 自动化测试工具selenium的常用定位方法
    定位方法不仅限于这些,有其他补充或建议,大家可以在评论区一起讨论哦!!! 【打开链接】drive.get(“https://www.baidu.com”) 【用id定位】drive.find_element_by_id(“kw......
  • 《黑马旅游网》综合案例(一)
    项目导入:初始的项目:链接:https://pan.baidu.com/s/1Fd-6zx4KaX-F7M5IhCWlEw提取码:btan把给定的初始项目导入即可项目启动:运行:就出来一个地址,复制到网页进行访问 ......
  • 数组排序方法sort---案例
    <template><divclass="Leading"><h2>人员列表</h2><inputtype="text"placeholder="请输入名字"v-model="keyword"><br><!--{{keyword}}-->......
  • Jedis案例
    案例:案例需求:提供index.html页面,页面中有一个省份下拉列表当页面加载完成后发送ajax请求,加载所有省份代码实现:ProvinceDaopackagecom.ailyt.dao;importco......
  • JQuery抽奖案例实现
    JQuery抽奖案例实现分析:给开始按钮绑定单机事件定义循环定时器切换小相框的src属性定义一个数组,存放图片资源......
  • JQuery案例 1_广告显示与隐藏
    JQuery案例1_广告显示与隐藏需求:当页面加载完,3秒后,自动显示广告广告显示5秒后,自动消失分析:使用定时器来完成,setTimeout(执行一次定时器)分析发现JQue......
  • SQL案例
    1.selecte.employee_nameASMANAGER,ROW_NUMBER()over(PARTITIONbye.dateorderbye.salaryDESC)ASRNFROM((selectDISTINCTb.manager_id,a.employee_namefro......
  • 项目案例-运用西门子PLC通过Modbus RTU采集YGWE通讯数据
    本案例控制的是YGWE冷却系统。系统主PLC选用西门子CPU,通过Modbus转Profinet网关采集YGWE通讯数据。 1、首先创建新项目文件;  2、导入GSD文件,将小疆智控MODBUS转PR......
  • 案例
    案例需求:提供index.html页面页面中有一个省份下拉列表当页面加载完成后发送ajax请求加载所有省份java代码实现配置文件数据库配置文件:druid.propertiesdrive......
  • Clickhouse windowFunnel函数使用
    --官方文档https://clickhouse.com/docs/zh/sql-reference/aggregate-functions/parametric-functions/#function-sequencecount对于事件进行连续跟踪分析能力,适用漏斗......