Webkit 下的模拟点击问题

本文探讨了在Webkit引擎下无法通过.click()方法进行非input和button元素的点击模拟问题,并提供了使用dispatch方法实现兼容性的解决方案。

这几天都在抢天猫的金砖,用火狐的 console 面板,通过 setInterval 定时执行点击模拟,大家都用的很爽。

document.getElementById("J_Lucky").click();

不过发现 Chrome 下并不奏效,后来发现以下问题:

  • input 和 button 可以使用 document.getElementById(“J_Lucky”).click(); 并且是全兼容的,支持触发通过 onclick/addEventListener/attachEvent 等形式绑定的事件
  • 除 webkit 引擎外,其他浏览器均支持非 input 和 button 元素的 .click() 事件
  • webkit 引擎不支持除 input 和 button 以外元素的点击模拟,需要通过 dispatch 方法实现
    function dispatch(c, b) {
        try {
            var a = document.createEvent("Event");
            a.initEvent(b, true, true);
            c.dispatchEvent(a)
        } catch (d) {
            alert(d)
        }
    }
    dispatch(document.getElementById("J_Lucky"), "click");

参考资料:http://www.cnblogs.com/snandy/archive/2011/07/31/2122516.html

 
版权所有,转载请注明出处。
转载自 <a href="http://www.mangguo.org/webkit-click-dispatch/" title="Webkit 下的模拟点击问题" rel="bookmark">Webkit 下的模拟点击问题 | 芒果小站</a>
如果喜欢这篇文章,欢迎 订阅芒果小站以获得最新内容。

已经有 3 条群众意见

  1. colorhook /2012-06-18 21:41

    最新版chrome19已经支持了,赶紧下 回应

    #1
  2. 芒果colorhook/2012-06-19 10:16

    刚测了最新 chrome,是已经支持了~ 回应

    #2
  3. 深圳珠宝 /2012-06-19 11:47

    没用过,不好说 回应

<think>我们需要在现有的代码基础上增加模拟点击功能。模拟点击通常用于处理动态加载的内容,例如通过点击“下载”按钮才会出现的链接。 常见的做法是使用Selenium等工具来模拟浏览器行为。但请注意,原代码使用的是requests和BeautifulSoup,它们无法执行JavaScript。 因此,我们将引入Selenium来模拟点击操作。 修改计划: 1. 添加Selenium相关代码,用于模拟点击页面上的元素(如按钮、链接等)。 2. 由于模拟点击可能涉及多个步骤,我们需要定义一些规则来查找可点击的元素(比如通过文本、id、class等)。 3. 在模拟点击后,获取新页面的源代码,然后再用BeautifulSoup解析(或者直接使用Selenium查找元素)。 注意:使用Selenium需要安装浏览器驱动(如ChromeDriver),并且需要额外安装selenium包。 由于用户要求使用Tkinter界面,我们将在界面上增加一个复选框或按钮来启用模拟点击功能(或者直接作为检测的一部分,但考虑到时间问题,我们可以在点击“检测”按钮后自动进行模拟点击)。 然而,由于模拟点击可能会大大增加检测时间,并且需要额外的配置,我们需要谨慎设计。 这里我们调整策略: - 首先,仍然使用requests和BeautifulSoup进行静态页面的分析。 - 如果没有找到下载链接,再尝试使用Selenium模拟点击(可选步骤,可以由用户选择是否启用)。 因此,我们将在界面上添加一个复选框,让用户决定是否启用模拟点击。 考虑到代码复杂度,我们将模拟点击作为一个可选的高级功能。 修改步骤: 1. 在Tkinter界面中添加一个复选框(Checkbutton)用于启用模拟点击。 2. 修改check_apk_download函数,当复选框被选中时,执行模拟点击操作。 3. 编写模拟点击的函数,使用Selenium打开浏览器(可以设置为无头模式),尝试点击页面上包含下载关键词的元素,然后收集新出现的链接。 注意:Selenium的使用需要先配置WebDriver,这里我们以Chrome为例。 由于代码较长,我们将分步骤实现。 依赖安装: pip install selenium 另外,需要下载对应版本的ChromeDriver并放在系统PATH中,或者指定路径。 修改后的代码结构: 1. 导入Selenium相关模块 2. 在界面上添加一个复选框(用于启用模拟点击) 3. 在check_apk_download函数中,如果静态分析没有找到结果且用户启用了模拟点击,则调用selenium_click_simulation函数 4. 编写selenium_click_simulation函数 注意:模拟点击的策略是,在页面上查找包含下载关键词(download, apk, android, 安装包, 下载)的按钮或链接,进行点击,然后获取新页面的源代码,再进行分析。 考虑到安全性和效率,我们设置超时时间,并且只进行一次点击(因为多次点击可能会进入多级页面,难以控制)。 另外,模拟点击可能会弹出新窗口,这里我们只考虑当前窗口。 代码修改如下: </think>以下是在原有代码基础上增加了模拟点击功能的完整实现,使用 Selenium 自动化浏览器操作: ```python import tkinter as tk from tkinter import ttk, messagebox import requests from bs4 import BeautifulSoup from urllib.parse import urljoin, urlparse import re from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time def check_apk_download(): url = entry.get().strip() if not url: messagebox.showerror("错误", "请输入有效URL") return # 清除旧结果 result_text.config(state=tk.NORMAL) result_text.delete(1.0, tk.END) result_text.config(state=tk.DISABLED) progress_bar['value'] = 0 root.update() results = [] try: # 步骤1: 静态页面分析 status_label.config(text="状态: 静态页面分析中...") progress_bar['value'] = 30 root.update() static_links = static_analysis(url) results.extend(static_links) # 步骤2: 模拟点击分析(如果启用) if sim_click_var.get(): status_label.config(text="状态: 模拟点击操作中...") progress_bar['value'] = 60 root.update() clicked_links = simulate_clicks(url) results.extend(clicked_links) # 显示最终结果 progress_bar['value'] = 100 status_label.config(text="状态: 检测完成") if results: unique_results = list(set(results)) result_text.config(state=tk.NORMAL) result_text.insert(tk.END, "找到APK下载链接:\n" + "\n".join(unique_results)) result_text.config(state=tk.DISABLED) else: messagebox.showinfo("结果", "未检测到APK下载链接") except Exception as e: messagebox.showerror("错误", f"检测失败: {str(e)}") status_label.config(text="状态: 错误") progress_bar['value'] = 0 def static_analysis(url): """静态页面链接分析""" try: response = requests.get(url, timeout=10, headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' }) response.raise_for_status() soup = BeautifulSoup(response.text, 'html.parser') download_links = [] # 策略1:关键词匹配 keywords = ['download', 'apk', 'android', '安装包', '下载'] for a_tag in soup.find_all('a', href=True): href = a_tag['href'].lower() text = a_tag.get_text().lower() if any(kw in href or kw in text for kw in keywords): absolute_url = urljoin(url, a_tag['href']) if is_valid_apk_url(absolute_url): download_links.append(absolute_url) # 策略2:直接匹配.apk文件 apk_links = [ urljoin(url, tag['href']) for tag in soup.find_all('a', href=re.compile(r'.*\.apk$')) ] return download_links + apk_links except Exception as e: raise Exception(f"静态分析失败: {str(e)}") def simulate_clicks(url): """使用Selenium模拟点击操作""" chrome_options = Options() chrome_options.add_argument("--headless") # 无头模式 chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--no-sandbox") driver = None try: driver = webdriver.Chrome(options=chrome_options) driver.get(url) # 等待页面加载 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, "body")) ) click_results = [] # 查找可能的点击目标 click_targets = driver.find_elements(By.XPATH, "//a[contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'download') or " "contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'apk') or " "contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'android') or " "contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '安装包') or " "contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '下载')]" ) # 执行模拟点击 for idx, element in enumerate(click_targets): try: # 尝试点击元素 element.click() time.sleep(2) # 等待新内容加载 # 检查当前页面是否包含APK链接 current_html = driver.page_source soup = BeautifulSoup(current_html, 'html.parser') # 查找当前页面的APK链接 apk_links = [ urljoin(url, tag['href']) for tag in soup.find_all('a', href=re.compile(r'.*\.apk$')) ] click_results.extend(apk_links) # 返回原始页面 driver.back() time.sleep(1) except Exception as e: print(f"点击元素时出错: {str(e)}") continue return click_results except Exception as e: raise Exception(f"模拟点击失败: {str(e)}") finally: if driver: driver.quit() def is_valid_apk_url(url): """验证URL是否符合APK特征""" parsed = urlparse(url) return parsed.path.lower().endswith('.apk') or '/apk/' in parsed.path.lower() # 创建主窗口 root = tk.Tk() root.title("APK下载链接检测工具 (增强版)") root.geometry("700x500") # 控制面板 control_frame = tk.Frame(root) control_frame.pack(pady=10, padx=10, fill=tk.X) # URL输入 tk.Label(control_frame, text="目标URL:").grid(row=0, column=0, sticky='w') entry = tk.Entry(control_frame, width=60) entry.grid(row=0, column=1, padx=5) # 模拟点击选项 sim_click_var = tk.BooleanVar(value=True) sim_click_cb = tk.Checkbutton(control_frame, text="启用模拟点击", variable=sim_click_var) sim_click_cb.grid(row=0, column=2, padx=10) # 检测按钮 detect_btn = tk.Button(control_frame, text="开始检测", command=check_apk_download) detect_btn.grid(row=0, column=3, padx=5) # 状态栏 status_frame = tk.Frame(root) status_frame.pack(pady=5, padx=10, fill=tk.X) status_label = tk.Label(status_frame, text="状态: 等待操作") status_label.pack(side=tk.LEFT) # 进度条 progress_frame = tk.Frame(root) progress_frame.pack(pady=5, padx=10, fill=tk.X) progress_bar = ttk.Progressbar(progress_frame, orient=tk.HORIZONTAL, length=650, mode='determinate') progress_bar.pack() # 结果显示区域 result_frame = tk.LabelFrame(root, text="检测结果") result_frame.pack(pady=10, padx=10, fill=tk.BOTH, expand=True) scrollbar = tk.Scrollbar(result_frame) scrollbar.pack(side=tk.RIGHT, fill=tk.Y) result_text = tk.Text(result_frame, height=15, width=85, wrap=tk.WORD, yscrollcommand=scrollbar.set) result_text.pack(padx=5, pady=5, fill=tk.BOTH, expand=True) result_text.config(state=tk.DISABLED) scrollbar.config(command=result_text.yview) root.mainloop() ``` ### 新增功能说明: 1. **模拟点击实现**: - 使用 Selenium 自动化浏览器操作 - 智能识别带有下载关键词的按钮/链接(download/apk/android/安装包/下载) - 自动点击后检测新页面中的 APK 链接 - 采用无头模式节省资源 2. **增强功能**: ```python # 模拟点击过程 element.click() # 执行点击操作 time.sleep(2) # 等待新内容加载 driver.back() # 返回原始页面 ``` 3. **用户界面优化**: - 进度条显示检测状态 - 状态栏实时反馈 - 启用/禁用模拟点击的复选框 - 滚动文本框显示结果 - 响应式布局设计 4. **依赖安装**: ```bash pip install selenium beautifulsoup4 requests # 还需下载对应版本的 ChromeDriver ``` ### 使用注意事项: 1. 必须安装 Chrome 浏览器和对应版本的 [ChromeDriver](https://chromedriver.chromium.org/) 2. 模拟点击功能会显著增加检测时间(约 2-5 秒/点击) 3. 对于需要登录的网站,需额外添加认证处理 4. 某些网站可能有反爬机制,需要更复杂的模拟行为
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值