Selenium find_element_by_id() 不起作用

问题描述 投票:0回答:6

当我使用 Selenium 访问 https://www.youtube.com 并尝试使用 find_element_by_id() 并使用“masthead-search-term”作为 ID 选择搜索栏时,我收到如下错误:

Traceback (most recent call last):
File "C:\Users\lauri\Desktop\Projects\Python Projects\test.py", line 9, in <module>
driver.find_element_by_id("masthead-search-term")
File "D:\Python\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 341, in find_element_by_id
return self.find_element(by=By.ID, value=id_)
File "D:\Python\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 843, in find_element
'value': value})['value']
File "D:\Python\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 308, in execute
self.error_handler.check_response(response)
File "D:\Python\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 194, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"id","selector":"masthead-search-term"}

这是为什么呢?这是代码:

import selenium.webdriver as webdriver
driver = webdriver.Chrome(executable_path="D:\Applications\chromedriver")
driver.get("https://www.youtube.com")
driver.find_element_by_id("masthead-search-term")
python selenium
6个回答
2
投票

您的代码是正确的。使用一些等待来定位元素。试试这个代码:

import selenium.webdriver as webdriver
driver = webdriver.Chrome(executable_path="D:\Applications\chromedriver")
driver.get("https://www.youtube.com")
driver.implicitly_wait(10)
driver.find_element_by_id("masthead-search-term").send_keys("Nature")

这是 Java 代码(如果需要,请设置 geckodriver):

WebDriver driver = new FirefoxDriver();

driver.get("https://www.youtube.com");
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.findElement(By.id("masthead-search-term")).sendKeys("Nature");

您还可以使用名称作为定位器:

driver.findElement(By.name("search_query")).sendKeys("Nature");

0
投票

您必须注意以下几件事:

  1. 使用 Chrome 浏览器时,尝试以 最大化 模式打开,并禁用 信息栏扩展,这样您就可以使用最大可用的

    Viewport

  2. 访问 URL https://www.youtube.com后,请等待加载程序消失或等待搜索框可点击。

  3. 确保您使用的定位器是唯一且正确的。使用 Firefox Quantum 57.0b3(64 位) 浏览器的 Dev Tools,搜索框的 XPath 表达式似乎是

    //input[@id='search']

  4. 这是浏览器的工作代码块:

    import selenium.webdriver as webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    options = Options()
    options.add_argument("start-maximized")
    options.add_argument("disable-infobars")
    options.add_argument("--disable-extensions")
    driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("https://www.youtube.com")
    search_box = WebDriverWait(driver, 20).until(
        EC.element_to_be_clickable((By.XPATH, "//input[@id='search']"))
    )
    driver.find_element_by_xpath("//input[@id='search']").send_keys("Selenium")
    

0
投票

这是浏览器问题。当我使用 Chrome、Firefox 或 Edge 时,我找不到该元素。当我使用 Internet Explorer 时,可以找到它。

当您使用 IEDriver 时,它可能会工作,但使用 ChromeDriver 时则不会。


0
投票

我认为您正在尝试找到搜索栏并发送密钥和搜索。不存在 ID 为 'masthead-search-term' 的元素。

我建议更好的方法是:

search_query = your_search_query
driver.get('https://www.youtube.com/results?search_query=' + search_query)

如果您想按照您已经完成的方式进行操作,那么它看起来会是这样的:

driver.get(http://www.youtube.com)
driver.find_element_by_id('search').sendKeys('Your_search_query')
driver.find_element_by_id('search-icon-legacy').click()

更有趣的方法之一是使用动作链:

driver.get(http://www.youtube.com)
actions = ActionChains(driver)
actions.send_keys('Your_Search_Query')
actions.send_keys(Keys.TAB)
actions.send_keys(Keys.ENTER)
actions.perform()

0
投票
Selenium 4.3.0
* Deprecated find_element_by_* and find_elements_by_* are now removed (#10712)
* Deprecated Opera support has been removed (#10630)
* Fully upgraded from python 2x to 3.7 syntax and features (#10647)
* Added a devtools version fallback mechanism to look for an older version when mismatch occurs (#10749)
* Better support for co-operative multi inheritance by utilising super() throughout
* Improved type hints throughout

您需要使用以下代码导入 Selenium WebDriver:

from selenium.webdriver.common.by import By

旧 API:

find_element_by_id(‘id’)
find_element_by_name(‘name’)
find_element_by_xpath(‘xpath’)

新API:

find_element(By.ID, ‘id’)
find_element(By.NAME, ‘name’)
find_element(By.XPATH,‘xpath’)

来源:修复 Selenium AttributeError:“WebDriver”对象没有属性“find_element_by_xpath”


-1
投票

如异常所示,页面上没有任何带有

id="masthead-search-term"
的元素。

通过检查页面 DOM 确保您正在寻找正确的 id。查找搜索栏输入元素的 id 属性。

我认为搜索栏输入元素id是

search

© www.soinside.com 2019 - 2024. All rights reserved.