Selenium Python - "No such element: Unable to locate element" 使用无头 chrome 在 iframe 中定位输入元素

Selenium Python - "No such element: Unable to locate element" locating an input element within an iframe with headless chrome

您好,我在 apple appstore 的自动登录上停留了一段时间,因为我试图在没有看到浏览器的情况下使其无头 execution.The 问题是在使用无头选项和其他选项执行时总体上没有'找到 appleid 的字段说:

 selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[id="account_name_text_field"]"}

这是我到目前为止尝试过的代码:

options = selenium_chrome()
options.add_argument("--enable-javascript")
options.add_argument('headless')
options.add_argument('--window-size=1920x1080')
options.add_argument('--start-maximized')
options.add_argument("--disable-notifications")
options.add_argument('--no-sandbox')
options.add_argument('--verbose')
options.add_experimental_option("prefs", {
        "download.default_directory": DOWNLOAD_DIR,
        "download.prompt_for_download": False,
        "download.directory_upgrade": True,
        "safebrowsing_for_trusted_sources_enabled": False,
        "safebrowsing.enabled": False
})
options.add_argument('--disable-gpu')
options.add_argument('--disable-software-rasterizer')


driver = webdriver.Chrome('/path/to/chromedriver', chrome_options=options)

driver.get('https://appstoreconnect.apple.com/login')
cookies = pickle.load(open("cookies.pkl", "rb"))
for cookie in cookies:
    driver.add_cookie(cookie)
time.sleep(10)
   
f = driver.find_element_by_id("aid-auth-widget-iFrame")
driver.switch_to.frame(f)
# driver.implicitly_wait(15)
time.sleep(20)
driver.find_element_by_id('account_name_text_field').send_keys('appleid')
driver.find_element_by_id("sign-in").click()
time.sleep(5)

driver.find_element_by_id('remember-me').click()
time.sleep(3)
driver.find_element_by_id('password_text_field').send_keys('password')
driver.find_element_by_id("sign-in").click()

备注:

  1. 我尝试获取 XPATH 和 CSS 选择器而不是 ID,结果是一样的。

  2. 我试过 time.sleep() 而不是

WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='account_name_text_field']"))).send_keys('appleid')

结果是TimeoutException

  1. 做了重试功能,每当找不到该字段时继续尝试直到找到它,但这是一种糟糕的方法并且没有奏效。

所以我不知道是什么导致了这种行为,发现该字段时没有 selenium 的选项并且它在视觉上可以正常登录,但是无论何时添加选项,它都找不到 [= 的输入文本字段18=] 了...可能是我不知道的 Apple 产品。

占位符为 Apple ID<input> 元素位于 中,因此您必须:

  • 诱导 WebDriverWait 所需的 帧可用并切换到它

  • 诱导 所需的 元素可点击

  • 您可以使用以下任一项:

    • 使用CSS_SELECTOR:

      driver.get("https://appstoreconnect.apple.com/login")
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe#aid-auth-widget-iFrame")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#account_name_text_field"))).send_keys("mastaofthepasta")
      
    • 使用 XPATH:

      driver.get("https://appstoreconnect.apple.com/login")
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='aid-auth-widget-iFrame']")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='account_name_text_field']"))).send_keys("mastaofthepasta")
      
  • 注意:您必须添加以下导入:

     from selenium.webdriver.support.ui import WebDriverWait
     from selenium.webdriver.common.by import By
     from selenium.webdriver.support import expected_conditions as EC
    
  • 浏览器快照:


参考

您可以在以下位置找到一些相关讨论:

  • Switch to an iframe through Selenium and python

更新

当您使用 and print the page_source 时,控制台上的输出是:

<html><head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>Apple</center>


<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
</body></html>

403 禁止

HTTP 403 Forbidden 响应状态代码表示服务器理解请求但拒绝授权。

这个状态类似于401,但是对于403 Forbidden状态码re-authenticating使得没有区别。永久禁止访问并与应用程序逻辑相关联,例如对资源的权限不足。


结论

as a 进一步导航被阻止。


参考资料

您可以在以下位置找到一些相关的详细讨论:

  • Website denies get request using Selenium

看来你的问题出在这里:
而不是

options.add_argument('headless')

应该是

options.add_argument('--headless')

即您在选项参数
之前缺少 -- UPD
而不是

driver = webdriver.Chrome('/path/to/chromedriver', chrome_options=options)

可能是

driver = webdriver.Chrome('/path/to/chromedriver', options=options)