更新 - 如何与我无法使用 python-selenium 获得的按钮进行交互?

问题描述 投票:0回答:4

新版本

我想浏览此链接显示的条款和条件弹出消息,无论是单击“同意”按钮还是“X”按钮关闭窗口,都使用python-selenium。

经过一些反馈,我现在知道我不是在处理 iframe,但问题是我无法获得任何这些按钮,似乎我必须更改焦点或类似的东西。

#======================
#Sets libraries
#======================
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common import action_chains
import time
from datetime import datetime

#======================
#Gets into the webpage and breaks the captcha
#======================
#Sets chr_options to pass the cloudflare captcha
chr_options = webdriver.ChromeOptions()
chr_options.add_experimental_option("detach", True)
chr_options.add_experimental_option("excludeSwitches", ["enable-automation"]) #Hides selenium browser features
chr_options.add_experimental_option('useAutomationExtension', False) #Hides selenium browser features
chr_options.add_argument("--disable-blink-features=AutomationControlled") #Hides testing browser features
chr_options.add_argument('--disable-extensions') #Disable extensions which may carry scripts
chr_options.add_argument('--no-sandbox') #Disable developer/sandbox mode
chr_options.add_argument('--disable-infobars') #Disable information bar
chr_options.add_argument('--disable-dev-shm-usage') #Disable memory optimization features
chr_options.add_argument('--disable-browser-side-navigation') #Disable memory optimization features
chr_options.add_argument('--disable-gpu') #Disable graphic features

#Sets the webdriver
chrdr_path="C:\Program Files (x86)\chromedriver.exe"
chrome_service=Service(executable_path=chrdr_path)
driver=webdriver.Chrome(service=chrome_service,options=chr_options)

#Opens 2 pages in the browser to simulate human behaviour
driver.execute_script("window.open('https://beacon.schneidercorp.com/Application.aspx?AppID=1015&LayerID=21105&PageTypeID=2&PageID=9036', '_blank')")
#Waits 15 seconds
time.sleep(15)
#Moves to beacon schneider window
driver.switch_to.window(driver.window_handles[1])
#Goes to the captcha frame
driver.switch_to.frame(0)
#Clicks on the chaptcha checkbox
driver.find_element(By.XPATH, '//*[@id="challenge-stage"]/div/label/input').click()

#Here I found the popup message which doens't let me pass
time.sleep(20)
# WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[text()='Agree'")))
popup_button=driver.find_element(By.XPATH,"//a[text()='Agree']")
popup_button.click()

在最后几行中,我一直在增加时间,设置显式等待,设置不同的等待方法(存在和可点击性),但它总是在搜索

By.XPATH,"//a[text()='Agree']"

的行上崩溃

看起来很简单,但我似乎不知道如何解决这个问题

原版

我想点击此消息上的“同意”按钮(我认为该消息是一个 iframe),在此 site 上获取一些数据。

我遇到的第一个问题是我真的不知道自己在处理什么。

这个页面一开始使用了cloudflare验证码来过滤机器人,多亏了这个video,这才通过了。

这是我迄今为止尝试过的:

  1. 通过其容器到达按钮(类名“modal-footer”和 xpath
    //*[@id="appBody"]/div[4]/div/div/div[2]/div[2]/a[1]
  2. 等到消息标题出现(类名“close”)
  3. 等到消息的“X”按钮可单击(类名“close”和xpath
    //*[@id="appBody"]/div[4]/div/div/div[1]/button/span
  4. 计算页面上的 iframe,以便我可以使用带有索引参数的 move_to 语句

一个好的方法可能是使用 EC.frame_to_be_available_and_switch_to_it 但我不知道如何引用框架。

我注意到一些可能感兴趣的事情:

  1. 我认为我正在处理的 iframe 是 height=1,width=1,可见性:隐藏为样式属性,它位于我尝试与之交互的弹出窗口的左上角。
  2. iframe 标签下方是托管于 link
  3. 的脚本

任何关于如何解决这个问题或我应该指向什么方向的建议将不胜感激

提前致谢, 安东尼奥

python selenium-webdriver web-scraping iframe
4个回答
0
投票

网页上的

Agree
按钮不在 Iframe 内。 您似乎遇到了元素可见性问题。 使用
explicit wait
并等待元素可点击。 使用以下 css 选择器来识别元素。

WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".modal-dialog a.button-1"))).click()

还需要导入以下库。

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait

0
投票

同意按钮不在

IFRAME
内,因此您无需担心处理 IFRAME 来单击所需的按钮。

参考下面的代码,使用 Explicit Waits

单击按钮
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://beacon.schneidercorp.com/Application.aspx?AppID=1015&LayerID=21105&PageTypeID=2&PageID=9036')

# Create a wait object with 10s wait time
wait = WebDriverWait(driver,10)

# Click on Agree cookies button
wait.until(EC.element_to_be_clickable((By.XPATH, "//a[text()='Agree']"))).click()
time.sleep(10)

0
投票

您会考虑使用 Selenium 的扩展吗?

完全公开,我是 Browserist 的作者。该软件包是 Selenium Web 驱动程序的轻量级、简洁的扩展,使浏览器自动化变得更加容易。只需使用

pip install browserist
安装软件包即可开始使用。

正如其他一些答案所指出的,cookie 横幅并未包含在 iframe 中。也许这样的东西会起作用?

from browserist import Browser

with Browser() as browser:
    browser.open.url("https://beacon.schneidercorp.com/Application.aspx?AppID=1015&LayerID=21105&PageTypeID=2&PageID=9036")
    browser.click.button("//div[@class='modal-footer']//a[text()='Agree']")

如果您想与 iframe 元素内的元素进行交互,然后返回原始页面,这相当简单。有关如何使用 Browserist 继续脚本的示例:

    browser.iframe.switch_to("//iframe[@id='id-of-iframe']")
    browser.click.button("//xpath/to/button/inside/iframe")
    browser.iframe.switch_to_original_page()

Browserist 还有一个处理 cookie 横幅的内置方法,这使得它更具可扩展性并且更易于阅读。您可以将上面的示例重构为:

from browserist import Browser, CookieBannerSettings

accept_cookies = CookieBannerSettings(
    url="https://beacon.schneidercorp.com/Application.aspx?AppID=1015&LayerID=21105&PageTypeID=2&PageID=9036",
    button_xpath="//div[@class='modal-footer']//a[text()='Agree']"
)

with Browser() as browser:
    browser.combo.cookie_banner(accept_cookies)

备注:

  • Browserist 不需要像
    WebDriverWait
    expected_conditions
    element_to_be_clickable
    这样的显式条件 - 它已经内置,因此您不必担心。相反,Browserist 会在与元素交互之前等待元素完全加载。有关此概念的更多信息此处

0
投票

我想我能够找到您所在的页面...至少看起来是相同或相似的。我检查了“同意”按钮,发现它不在 IFRAME 中。下面的 XPath 将找到该按钮。

//a[text()='Agree']

它基本上只是查找包含文本“同意”的 A 标签。


您的代码缺少等待可点击“同意”按钮的时间。您已注释掉等待,但定位器不完整,因此失败。我删除了不需要的代码,重新添加了等待,并修复了定位器。下面的代码正在运行。

#Opens 2 pages in the browser to simulate human behaviour
driver.execute_script("window.open('https://beacon.schneidercorp.com/Application.aspx?AppID=1015&LayerID=21105&PageTypeID=2&PageID=9036', '_blank')")
#Moves to beacon schneider window
driver.switch_to.window(driver.window_handles[1])
#Goes to the captcha frame
driver.switch_to.frame(0)
#Clicks on the chaptcha checkbox
driver.find_element(By.XPATH, '//*[@id="challenge-stage"]/div/label/input').click()
driver.switch_to.default_content    
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[text()='Agree']"))).click()
© www.soinside.com 2019 - 2024. All rights reserved.