硒找不到元素

时间:2020-02-23 10:53:31

标签: python selenium selenium-chromedriver discord

我正在创建一个基本脚本,该脚本从Discord 2FA备份代码文本文件中选择一个随机代码,然后将其放入2fa框中并在登录时提交。我已经完成让该机器人输入您的电子邮件和密码并进行初始登录,并从该文本文件中选择了一个随机代码。

我当前的问题是Selenium由于某种原因找不到将2fa代码输入到的框:https://gyazo.com/52ca628569f351fec1306332da7e1045

相应的html是:

<input class="inputDefault-_djjkz input-cIJ7To" name="" type="text" placeholder="6-digit authentication code" aria-label="Enter Discord Auth Code" autocomplete="off" maxlength="10" spellcheck="false" value="">

所以我正在使用

codefill = browser.find_element_by_xpath("""//*[@id="app-mount"]/div[1]/div/div[2]/div/form/div/div[3]/div/div/input""")
codefill.clear()
codefill.send_keys(trycode)

要查找元素,请清除,然后输入代码变量。我不断收到以下错误:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="app-mount"]/div[1]/div/div[2]/div/form/div/div[3]/div/div/input"}
  (Session info: chrome=79.0.3945.130)

您知道如何解决此问题或做错了什么吗?谢谢:)

1 个答案:

答案 0 :(得分:0)

我将必须看到完整的html,以便100%确定,但我90%的确定是因为您要查找的元素位于 frame 元素内。

因此,假设frame元素的名称为“ FRM”,则html看起来将类似于

<frame name ="FRM"><frame>
    ...
     ...
      ...
        <your element>

如果元素在框架中,则需要在访问该元素之前将驱动程序切换到该框架。

EC.frame_to_be_available_and_switch_to_it()

这是一个很棒的功能,因为它不仅可以切换,而且与WebDriverWait结合使用,程序会在切换到帧之前等待帧完全加载。

(+我认为您可以更有效地为元素编写xpath)

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

WebDriverWait(browser, 10).until(EC.frame_to_be_available_and_switch_to_it((By.NAME,"FRM")))
WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.XPATH, '//input[@class="inputDefault-_djjkz input-cIJ7To"]'))).send_keys(trycode)

您当然可以通过使用 By.ID By.CLASS_NAME 来使用框架的其他属性。