find_element_by_id 不适用于特定网站,但适用于 Youtube
find_element_by_id not working on a specific site but works for Youtube
已解决!
我不知道 iframe 是什么,Arundeep Chohan 在评论中提到了它们,这让我陷入了困境,并且知道我可以使用它。
我想要他的回答,但他留下了评论。谢谢阿伦迪普!
++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++
我正在尝试编写一个程序来自动让我登录到站点,但是 find_element_by_id 似乎不适用于此登录页面。我让它在 Youtube 上工作,但到目前为止我正在寻找的 ID 似乎没有在此站点上被检测到。
我也试过find_element_by_name和find_element_by_class也没用。
下面是我的代码
# 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"]
我可以想到 2 个解决方案:
- 让浏览器在搜索元素之前隐式等待,以便为网站加载留出时间。
- 使用 xpath 而不是通过 id 名称查找,就像在检查元素中右键单击元素并单击复制完整 xpath 一样简单。
driver.get()
之后
driver.implicitly_wait(10)
然后进行搜索。您可以改用 webdriver waits。
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
已解决!
我不知道 iframe 是什么,Arundeep Chohan 在评论中提到了它们,这让我陷入了困境,并且知道我可以使用它。
我想要他的回答,但他留下了评论。谢谢阿伦迪普! ++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++
我正在尝试编写一个程序来自动让我登录到站点,但是 find_element_by_id 似乎不适用于此登录页面。我让它在 Youtube 上工作,但到目前为止我正在寻找的 ID 似乎没有在此站点上被检测到。
我也试过find_element_by_name和find_element_by_class也没用。
下面是我的代码
# 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"]
我可以想到 2 个解决方案:
- 让浏览器在搜索元素之前隐式等待,以便为网站加载留出时间。
- 使用 xpath 而不是通过 id 名称查找,就像在检查元素中右键单击元素并单击复制完整 xpath 一样简单。
driver.get()
之后driver.implicitly_wait(10)
然后进行搜索。您可以改用 webdriver waits。
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