python selenium实现点击a href="javascript.void(0)"

本文介绍使用Selenium处理带有javascript:void(0)的登录按钮的方法。通过调整代码,利用find_elements_by_tag_name和get_attribute检查链接,实现了点击操作。同时提供了一个更简洁的XPath解决方案。
部署运行你感兴趣的模型镜像

在使用selenium进行登录操作练手时,发现登录按钮是用a href="javascript.void(0)"实现的,
于是按照习惯思维进行点击

a = soup.find_all('a')
for names in a:
    try:
        print (names['href'])
        if names['href'] == "javascript:void(0);":
            print "IM IN HUR"
            names.click()
            break
    except:
        continue

发现无法点击,提示names没有那个点击属性
因为他是xml属性,没有点击属性,需要进行如下改造

aElements = browser.find_elements_by_tag_name("a")
for name in aElements:
    if(name.get_attribute("href") is not None and "javascript:void" in name.get_attribute("href")):
        print("IM IN HUR")
        name.click()
        break

这个代码量比较多,还可以通过xpath实现
当登陆选项有class标签为login时可用。或者其他的。

links = browser.find_element.by_xpath('//a[@class="login"]')
links.click()

https://stackoverflow.com/questions/35635988/selenium-and-python-cant-click-href-javascriptvoid0-with-click

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

对于页面 <div class="container navigation"> <div class="row"> <div class="col nav"> <ul class="pc-nav" id="runoob-detail-nav"> <li><a href="//www.runoob.com/">首页</a></li> <li><a href="/html/html-tutorial.html">HTML</a></li> <li><a href="/css/css-tutorial.html">CSS</a></li> <li><a href="/js/js-tutorial.html">JavaScript</a></li> <li><a href="javascript:void(0);" data-id="vue">Vue</a></li> <li><a href="/react/react-tutorial.html">React</a></li> <!-- <li><a href="/nodejs/nodejs-tutorial.html">NodeJS</a></li>--> <li><a href="/python3/python3-tutorial.html">Python3</a></li> <!-- <li><a href="/python/python-tutorial.html">Python2</a></li> --> <li><a href="/java/java-tutorial.html">Java</a></li> <li><a href="/cprogramming/c-tutorial.html">C</a></li> <li><a href="/cplusplus/cpp-tutorial.html">C++</a></li> <li><a href="/csharp/csharp-tutorial.html">C#</a></li> <li><a href="javascript:void(0);" data-id="aiNav">AI</a></li> <li><a href="/go/go-tutorial.html">Go</a></li> <li><a href="/sql/sql-tutorial.html">SQL</a></li> <li><a href="/linux/linux-tutorial.html">Linux</a></li> <li><a href="/vscode/vscode-tutorial.html">VS Code</a></li> <!--<li><a href="/jquery/jquery-tutorial.html">jQuery</a></li>--> <li><a href="javascript:void(0);" data-id="bootstrap">Bootstrap</a></li> <li><a href="/git/git-tutorial.html">Git</a></li> <li><a href="/browser-history">本地书签</a></li><!-- <li><a href="https://www.jyshare.com/front-end/9235/" target="_blank">AI 编程助理</a></li> --> <!-- <li><a href="/w3cnote/knowledge-start.html" style="font-weight: bold;" onclick="_hmt.push(['_trackEvent', '星球', 'click', 'start'])" title="我的圈子">我的圈子</a></li> <li><a href="javascript:;" class="runoob-pop">登录</a></li> --> </ul> <ul class="mobile-nav"> <li><a href="//www.runoob.com/">首页</a></li> <li><a href="/html/html-tutorial.html">HTML</a></li> <li><a href="/css/css-tutorial.html">CSS</a></li> <li><a href="/js/js-tutorial.html">JS</a></li> <li><a href="/browser-history">本地书签</a></li> <li><a href="javascript:void(0)" class="search-reveal">Search</a> </li> </ul> </div> </div> </div> 识别到的结果 C:\own\app\python_code\.venv\Scripts\python.exe C:\own\app\python_code\work\入职培训\打印点击\导航栏识别测试.py 共识别出 8 个导航栏 导航栏 #1: <div class='container navigation'> 导航栏 #2: <div class='col nav'> 导航栏 #3: <ul class='pc-nav'> 导航栏 #4: <ul class='mobile-nav'> 导航栏 #5: <div class='container navigation'> 导航栏 #6: <div class='container navigation'> 导航栏 #7: <div class='row'> 导航栏 #8: <div class='col nav'> Process finished with exit code 0 识别不全啊 from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get("file:///C:/own/app/python_code/work/入职培训/打印点击/111.html") def is_navigation_bar(element, max_depth=5, current_depth=0): try: if current_depth > max_depth: return False if element.tag_name.lower() == 'nav': return True role = element.get_attribute('role') if role and role.lower() == 'navigation': return True class_name = element.get_attribute('class') if class_name: class_name = class_name.lower() if any(keyword in class_name for keyword in ['nav', 'navbar', 'navigation', 'menu', 'bar']): return True if contains_navigation_structure(element): return True try: parent = element.find_element(By.XPATH, '..') return is_navigation_bar(parent, max_depth, current_depth + 1) except: return False except Exception as e: print(f"[导航栏识别] 出错: {e}") return False def contains_navigation_structure(element): """增强结构识别:查找是否有多个 <a>、<p> 或 <li>,支持深层嵌套结构""" links = element.find_elements(By.XPATH, './/a | .//p | .//li') link_count = 0 for el in links: if el.tag_name == 'a': href = el.get_attribute('href') if href and href != 'javascript:void(0);': link_count += 1 elif el.tag_name in ['p', 'li']: text = el.text.strip() if text: link_count += 1 if link_count >= 2: return True lists = element.find_elements(By.XPATH, './/ul | .//ol') if len(lists) >= 1: return True return False # ✅ 使用 CSS 选择器查找所有可能的候选元素 def find_all_navigation_bars(driver): candidates = [] # 1. 查找 <nav> 标签 nav_elements = driver.find_elements(By.TAG_NAME, 'nav') candidates.extend(nav_elements) # 2. 查找 role="navigation" role_navs = driver.find_elements(By.XPATH, '//*[@role="navigation"]') candidates.extend(role_navs) # 3. 查找常见 class 名称的元素 class_keywords = ['nav', 'navbar', 'navigation', 'menu', 'bar'] for keyword in class_keywords: elements = driver.find_elements(By.CSS_SELECTOR, f'[class*="{keyword}"]') candidates.extend(elements) # 4. 查找包含 ul/li 结构的容器 list_containers = driver.find_elements(By.XPATH, '//div[.//ul] | //div[.//ol] | //nav[.//ul] | //nav[.//ol]') candidates.extend(list_containers) # 去重 + 筛选 unique_candidates = [] seen = set() for el in candidates: id_ = id(el) if id_ not in seen: seen.add(id_) if is_navigation_bar(el): unique_candidates.append(el) return unique_candidates # ✅ 主程序入口 nav_bars = find_all_navigation_bars(driver) print(f"共识别出 {len(nav_bars)} 个导航栏") for i, nav in enumerate(nav_bars): try: tag = nav.tag_name class_name = nav.get_attribute('class') print(f"导航栏 #{i+1}: <{tag} class='{class_name}'>") except Exception as e: print(f"导航栏 #{i+1}: 无法获取信息", e) driver.quit()
最新发布
08-23
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值