如何使用 Selenium e Tor 按下“不可见”按钮,但知道 html ID?
Posted
技术标签:
【中文标题】如何使用 Selenium e Tor 按下“不可见”按钮,但知道 html ID?【英文标题】:How to press a "not visible" button with Selenium e Tor, but knowing the html ID? 【发布时间】:2021-09-19 07:41:08 【问题描述】:在 Firefox 中使用 Selenium 和 WebDriverWait,我想按“接受”按钮。在普通浏览器上,按钮屏幕显示正常,但问题是我正在使用 Tor 访问该站点,因此按钮屏幕显示为暗淡/阴影:它无限加载并且永远不会显示。 o 就像从未检测到按钮一样。事实上,在 Python 控制台中,我收到错误“selenium.common.exceptions.TimeoutException: Message”,因为秒过去了,但找不到按钮。我也试过直接打开 Tor 浏览器(没有 Python 和代码),有同样的事情:模糊按钮掩码
我读到即使按钮不可见,也可以通过直接干预代码来按下按钮。我能怎么做?我再说一遍,使用普通浏览器时,按钮就在那里,但使用 Tor 时,它会变暗。可能我想总是将等待与 WebDriverWait 一起使用。我真诚地感谢任何会帮助我的人。我将不胜感激任何善意的回应
按钮的html代码是onetrust-accept-btn-handler,准确来说是:
普通浏览器的按钮页面是:
带有 Tor 和空白/隐藏屏幕的页面是:
这是我的代码:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
#CODE TOR CONNECTION
from selenium import webdriver
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
import os
torexe = os.popen('/home/mypc/.local/share/torbrowser/tbb/x86_64/tor-browser_en-US')
profile = FirefoxProfile('/home/mypc/.local/share/torbrowser/tbb/x86_64/tor-browser_en-US/Browser/TorBrowser/Data/Browser/profile.default')
profile.set_preference('network.proxy.type', 1)
profile.set_preference('network.proxy.socks', '127.0.0.1')
profile.set_preference('network.proxy.socks_port', 9050)
profile.set_preference("network.proxy.socks_remote_dns", False)
profile.update_preferences()
firefox_options = webdriver.FirefoxOptions()
firefox_options.binary_location = '/usr/bin/firefox'
driver = webdriver.Firefox(
firefox_profile=profile, options=firefox_options,
executable_path='/usr/bin/geckodriver')
#CODE CLICK BUTTON
driver.maximize_window()
driver.get("link")
WebDriverWait(browser, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, "onetrust-accept-btn-handler"))).click()
我使用了presence_of_element_located(),它期望检查一个元素是否存在于页面的DOM上。这并不一定意味着该元素是可见的。
我也试过了
element = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[id='onetrust-accept-btn-handler']")))
或
WebDriverWait(driver,15).until(EC.element_to_be_clickable((By.XPATH,"//button[@class='onetrust-accept-btn-handler')]"))).click()
我总是和每个人都犯同样的错误,selenium.common.exceptions.TimeoutException: Message" 因为秒过去了,但没有找到按钮。
【问题讨论】:
【参考方案1】:尝试等待元素出现,然后使用 javascript 而不是 Selenium 来单击它。像这样:
WebDriverWait(browser, 20).until(EC.presence_of_element_located((By.ID, "onetrust-accept-btn-handler")))
driver.execute_script("document.getElementsById('onetrust-accept-btn-handler')[0].click()")
JavaScript 能够访问不可见的元素。这不会通过 GUI 完全模拟真实的用户手动操作,但它会起作用。
【讨论】:
非常感谢您的友好回复 :) 我试过了。还是同样的错误:selenium.common.exceptions.TimeoutException: Message 请验证定位器是否正确。你能再给我一个指向那个页面的链接吗? 我对 Tor 一点也不熟悉 我明白了。也许解决方案是在设置中添加此首选项或类似 profile.set_preference ('network.cookie.cookieBehavior', 2) 的内容。我正在阅读一段时间。无论如何,谢谢你的帮助。在对上一个问题产生误解后,我很感激。谢谢你。和平! :) 如果您最终找到解决方案,请告诉我。我不知道 Tor 是什么,但对于 Selenium,我的解决方案肯定可以工作。以上是关于如何使用 Selenium e Tor 按下“不可见”按钮,但知道 html ID?的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 上使用 Selenium 来操作 Tor。由于未知原因不起作用
如何使用 selenium WebDriver 按下(向下箭头+shift 键)按钮?
Cloudflare 如何区分 Selenium 和 Requests 流量?
如果'checked'属性不可用于使用isChecked / isSelected,如何使用selenium检查复选框的状态? [复制]