Python 按id查找元素不适用于特定网站,但适用于Youtube

Python 按id查找元素不适用于特定网站,但适用于Youtube,python,selenium,findelement,Python,Selenium,Findelement,解决了 我不知道iframes是什么,Arundeep Chohan在评论中提到了它们,这让我陷入了一个兔子洞,我知道我成功了 我想知道他的答案,但他留下了评论。谢谢阿伦德普! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 我正试图编写一个程序来自动将我登录到一个站点,但find_元素\u by_id似乎不适用于此登录页面。我在Youtube上找到了它,但到目前为止,我正在寻找的id在这个网站上似乎没

解决了

我不知道iframes是什么,Arundeep Chohan在评论中提到了它们,这让我陷入了一个兔子洞,我知道我成功了

我想知道他的答案,但他留下了评论。谢谢阿伦德普! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

我正试图编写一个程序来自动将我登录到一个站点,但find_元素\u by_id似乎不适用于此登录页面。我在Youtube上找到了它,但到目前为止,我正在寻找的id在这个网站上似乎没有被检测到

我也尝试过按名称查找元素和按类查找元素,但都没有效果

下面是我的代码

# Imports
import selenium
from selenium import webdriver

# Variables
UsNam = "MY_USERNAME"

# Assigning Firefox to browser
browser = webdriver.Firefox(executable_path=r"C:\Users\ME\Geckodriver\geckodriver-v0.27.0-win64\geckodriver.exe")

# Opening the webpage
browser.get("https://THESITEIWANTTOLOGINTO.com/abunchofloginpagestuff")

# Finding the login input
NameEntry = browser.find_element_by_id('USER')
browser.implicitly_wait(15)

# Entering the username
NameEntry.send_keys(UsNam)


这是我在硒中找不到的元素

<input class="form-control ng-pristine ng-invalid ng-invalid-required" type="text" name="USER" id="USER" data-payxautoid="paychex.app.login.userName.input.username" placeholder="Enter Username" maxlength="50" data-ng-model="user.username" data-payx-focus="" data-ng-change="clearShowError()" required="" data-payx-form-value="siteminder.username">

我刚刚注意到的一件奇怪的事情是,当我复制并粘贴元素时,id没有出现在那里。它应该是“input id=“USER”class=…”

任何帮助都将不胜感激。我试着阅读其他问题,但没有找到任何答案,这就是为什么我现在在这里

谢谢

编辑:这是我的错误消息

Traceback (most recent call last):
  File "C:/Users/Crow/PycharmProjects/Login/main.py", line 15, in <module>
    NameEntry = browser.find_element_by_id('USER')
  File "C:\Users\Crow\PycharmProjects\Login\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 360, in find_element_by_id
    return self.find_element(by=By.ID, value=id_)
  File "C:\Users\Crow\PycharmProjects\Login\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 976, in find_element
    return self.execute(Command.FIND_ELEMENT, {
  File "C:\Users\Crow\PycharmProjects\Login\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\Crow\PycharmProjects\Login\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [id="USER"]
回溯(最近一次呼叫最后一次):
文件“C:/Users/Crow/PycharmProjects/Login/main.py”,第15行,在
NameEntry=浏览器。按\u id(“用户”)查找\u元素
文件“C:\Users\Crow\PycharmProjects\Login\venv\lib\site packages\selenium\webdriver\remote\webdriver.py”,第360行,按id查找元素
返回self.find_元素(by=by.ID,value=ID_u)
文件“C:\Users\Crow\PycharmProjects\Login\venv\lib\site packages\selenium\webdriver\remote\webdriver.py”,第976行,在find_元素中
返回self.execute(Command.FIND_元素{
文件“C:\Users\Crow\PycharmProjects\Login\venv\lib\site packages\selenium\webdriver\remote\webdriver.py”,第321行,在execute中
self.error\u handler.check\u响应(响应)
文件“C:\Users\Crow\PycharmProjects\Login\venv\lib\site packages\selenium\webdriver\remote\errorhandler.py”,第242行,在check\u响应中
引发异常类(消息、屏幕、堆栈跟踪)
selenium.common.exceptions.NoSuchElementException:消息:无法定位元素:[id=“USER”]

我可以想出两种解决方案:

  • 使浏览器在搜索元素之前隐式等待,以便给网站加载时间
  • 使用xpath而不是按id名称查找,就像在inspect元素中右键单击元素并单击copy full xpath一样简单
  • 在driver.get()之后

    然后进行搜索。您可以使用webdriver等待

    driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))
    
    检查页面并检查iframe。复制iframe的xpath、css和id,并将其插入到上面的行中,并进行相应的更改

    而不是等待和搜索:

    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "User"))).send_keys(UsNam)
    
    进口

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

    您得到了什么错误?请也添加该错误。可能需要在驱动程序之后引发一些等待。get()。我添加了错误消息,并且在驱动程序之后隐式等待了15。请立即获取,而不是在find_元素之后检查它是否在iframe中,否则请使用另一个标识符。iframe是什么?我对此不熟悉。我将隐式等待移到find元素之前,并将其设置为15。它仍然返回我添加的错误消息。你能详细说明一下如何使用xpath吗?我将使用什么方法来实现它?浏览器。通过xpath查找元素(“此处为您的xpath”)我仍然收到一条错误消息````消息:无法找到元素://*[@id=“USER”]```我将xpath作为//*[@id=“USER”]您没有正确地从网站复制xpath。右键单击页面的某部分,检查元素,右键单击html的某部分,然后按copy(两者都可以)完整xpath或常规xpath(至少在chrome上)然后通过xpath命令将其放入find_元素。我使用的是firefox。我右键单击登录框,然后单击inspect元素,右键单击已检查的元素,然后单击copy,然后单击xpath。它应该是什么样子?
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait 
    from selenium.webdriver.support import expected_conditions as EC