Я пытаюсь очистить динамический сайт (https://app.shaggyowl.com/accesso-titolare/index.html) с помощью селена и Python. Я нашел обходной путь для вставки имени пользователя и пароля, но не могу нажать кнопку (ниже).
text_editing_host_element = driver.find_element(By.CSS_SELECTOR, "flt-text-editing-host")
script = """
var input = document.createElement("input");
input.setAttribute("autocomplete", "off");
input.setAttribute("autocorrect", "on");
input.setAttribute("class", "flt-text-editing transparentTextEditing");
input.style.cssText = "forced-color-adjust: none; white-space: pre-wrap; align-content: center; position: absolute; top: 0px; left: 0px; padding: 0px; opacity: 1; color: transparent; background: transparent; caret-color: transparent; outline: none; border: none; resize: none; text-shadow: none; overflow: hidden; transform-origin: 0px 0px 0px; font: 16px Poppins, -apple-system, BlinkMacSystemFont, sans-serif; width: 280px; height: 22px; transform: matrix(1, 0, 0, 1, 202.5, 335.3);";
arguments[0].appendChild(input);
"""
driver.execute_script(script, text_editing_host_element)
time.sleep(2)
driver.find_element(By.CSS_SELECTOR, 'body > flutter-view > flt-text-editing-host > input').click()
driver.find_element(By.CSS_SELECTOR, 'body > flutter-view > flt-text-editing-host').send_keys(
'Username')
time.sleep(1)
driver.find_element(By.CSS_SELECTOR, 'body > flutter-view > flt-text-editing-host').send_keys(Keys.TAB)
driver.find_element(By.CSS_SELECTOR, 'body > flutter-view > flt-text-editing-host > input:nth-child(2)').send_keys(
'Password')
Я искал Shadow-dom и динамические сайты с помощью js, но не нашел решения и был бы рад, если бы кто-нибудь дал мне предложение. заранее спасибо
Кнопка на самом деле является частью приложения Flutter и отображается внутри только при нажатии.
Я не вижу никаких признаков того, что он отображается shadow-dom
, но если он не существует до действия, прямого способа его найти нет.
Однако, сосредоточившись на вводе пароля и набрав пароль, вы можете щелкнуть по нему со смещением от поля пароля с помощью ActionChains
.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains, Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
driver = webdriver.Chrome()
driver.maximize_window()
link = "https://app.shaggyowl.com/accesso-titolare/index.html"
driver.get(link)
action_chains = ActionChains(driver)
wait = WebDriverWait(driver, 10)
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'flutter-view')))
action_chains.send_keys(Keys.TAB).perform()
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'flt-text-editing-host')))
action_chains.send_keys('Username').perform()
time.sleep(1)
action_chains.send_keys(Keys.TAB).perform()
action_chains.send_keys('Password').perform()
input = driver.find_element(By.CSS_SELECTOR, 'input[type=password]')
action_chains.move_to_element_with_offset(input, 10, 100).click().perform()
@Федерико, я рад помочь. Можете ли вы пометить этот ответ как правильный, если он решит вашу проблему?
Большое спасибо за ваше предложение @Yarlavm! Я сделал именно так, и это работает!