当我使用 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")
您的代码是正确的。使用一些等待来定位元素。试试这个代码:
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");
您必须注意以下几件事:
使用 Chrome 浏览器时,尝试以 最大化 模式打开,并禁用 信息栏 和 扩展,这样您就可以使用最大可用的
Viewport
。
访问 URL https://www.youtube.com后,请等待加载程序消失或等待搜索框可点击。
确保您使用的定位器是唯一且正确的。使用 Firefox Quantum 57.0b3(64 位) 浏览器的 Dev Tools,搜索框的 XPath 表达式似乎是
//input[@id='search']
。
这是浏览器的工作代码块:
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")
这是浏览器问题。当我使用 Chrome、Firefox 或 Edge 时,我找不到该元素。当我使用 Internet Explorer 时,可以找到它。
当您使用 IEDriver 时,它可能会工作,但使用 ChromeDriver 时则不会。
我认为您正在尝试找到搜索栏并发送密钥和搜索。不存在 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()
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”
如异常所示,页面上没有任何带有
id="masthead-search-term"
的元素。
通过检查页面 DOM 确保您正在寻找正确的 id。查找搜索栏输入元素的 id 属性。
我认为搜索栏输入元素id是
search
。