Selenium Python无法定位此网站被阻止的元素?(阴影DOM)

2024-09-30 22:21:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用python中的selenium来填充此表单:https://ing.ingdirect.es/app-login/

使用此代码:

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

browser = webdriver.Firefox(executable_path = '/usr/local/bin/geckodriver')
browser.get('https://ing.ingdirect.es/pfm/#login')

WebDriverWait(browser, 30).until(EC.presence_of_element_located((By.CSS_SELECTOR, '#aceptar'))).click()

browser.find_element_by_css_selector('#ing-uic-native-input_0').send_keys('xx')

但我得到了这个错误:

NoSuchElementException: Message: Unable to locate element: #ing-uic-native-input_0

inspection screenshot

我试图找到框架和其他方法来查找元素,但没有成功:xpath、id等

有什么建议吗


Tags: fromhttpsimportbrowsersupportbyesselenium
3条回答

首先,在所有测试步骤开始时接受cookie一次

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

wait = WebDriverWait(driver, 30)
wait.until(EC.element_to_be_clickable(
            (By.CSS_SELECTOR, "#aceptar")))
accept_cookies = driver.find_element_by_css_selector("#aceptar")
accept_cookies.click()

第二,在接受cookies之后,用户被重定向到https://ing.ingdirect.es/app-login/ 没有#ing-uic-native-input_0CSS元素。 例如,如果您正在寻找Número de documento,请使用:

driver.find_element_by_id("input")

此外,在进行输入之前,请使用visibility_of_element_located而不是presence_of_element_located。它应该更可靠

wait=WebDriverWait(browser, 20)
browser.get('https://ing.ingdirect.es/app-login/')
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#aceptar'))).click()
root1 = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'body > ing-app-login-sca-es')))
root1 = driver.execute_script('return arguments[0].shadowRoot', root1)
root2 = root1.find_element_by_css_selector('div > div.wrapper-login > ing-orange-login-sca-es')
root2 = driver.execute_script('return arguments[0].shadowRoot', root2)
root3 = root2.find_element_by_css_selector('#loginSteps > ing-uic-login-sca-es-step-credentials')
root3 = driver.execute_script('return arguments[0].shadowRoot', root3)
root4 = root3.find_element_by_css_selector('#credentialsForm > form > div:nth-child(2) > div > ing-uic-login-sca-es-el-input')
root4 = driver.execute_script('return arguments[0].shadowRoot', root4)
root4.find_element_by_css_selector('#ing-uic-native-input_0').send_keys('xx')

下面是它的手动外观。手动获取4个元素的阴影根看起来很糟糕。另外,您的登录url很难登录

我想,这是你的解决方案Does anybody know how to identify shadow dom web elements using selenium webdriver?

您正在尝试使用shadowdomwebelements获取元素

或者尝试使用安装pyshadow库:

pip install pyshadow

然后像这样使用:

from pyshadow.main import Shadow
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://ing.ingdirect.es/pfm/#login')
shadow = Shadow(browser)

shadow.set_explicit_wait(20, 5)
shadow.find_element("#aceptar").click()
element = shadow.find_element("#ing-uic-native-input_0")
element.send_keys('xx')

我不喜欢使用所有的包装器,但看起来阴影元素需要一些包装器工作,谷歌的人已经做了

其次,要通过单击“接受cookies”跳过该步骤,有一种很好的方法可以存储该步骤的cookies并每次替换它们:

第一次运行:

import pickle
cookies = browser.get_cookies()
with open("cookies.pkl", "wb") as f:
    pickle.dump(browser.get_cookies(), f)

然后,每次删除并运行该文件:

cookies = pickle.load(open("cookies.pkl", "rb"))
for cookie in cookies:
    browser.add_cookie(cookie)

相关问题 更多 >