У меня проблема с поиском WebElement в Selenium. Я попытался заполнить поле ввода, это html:
<div class = "container">
<div class = "tp-fl" id = "btnSearchStockAutoComplete">
<span class = "tp-icon tp-search tp-co-3 "></span>
</div>
<angucomplete placeholder = "search" searchfields = "Not Found" pause = "400" set-focus = "tpFocus" selectedobject = "tpSelected" titlefield = "label" inputclass = "form-control form-control-small" matchclass = "highlight" api = "tpApi" disable = "disableSearchBox" stockdetails = "stockdetails" class = "ng-isolate-scope">
<div class = "tp-re angucomplete-holder tp-width">
<div id = "fulltextContainer" style = "display: none" class = "symbol-info tp-etc">
</div>
<input id = "txt_search" class = "search-box tp-co-1 tp-pa-rl-5 tp-re tp-bo-bo" type = "text" placeholder = "Search" onmouseup = "this.select();" autocomplete = "off">
<div id = "auto-list-container" class = "auto-list-container tp-bg-2 tp-co-1 tp-bo-4 tp-bo tp-width angucomplete-dropdown" style = "min-width: 250px; display: none">
<div style = "display: none" id = "loading" class = "tp-h-35 tp-pa-rl-10 angucomplete-searching">Searching ...</div>
<div style = "display: none" id = "norecord" class = "tp-35 tp-pa-rl-10 angucomplete-searching">Not Found </div>
<div id = "list_dropdown">
</div>
</div>
</div>
</angucomplete>
</div>
это мой код на питоне:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser=webdriver.Chrome('path')
inputTxt=browser.find_element_by_xpath('//*[@id = "txt_search"]')
inputTxt.send_keys('stock')
но когда я запускаю эту программу, она выдает мне ошибку и выдает исключение "selenium.common.exceptions.ElementNotInteractableException: Message: element not interactableException", мне было интересно, есть ли какое-либо возможное решение этой проблемы.
Я хочу заполнить элемент ввода, как я уже упоминал, я использовал метод send_keys(), но он выдает это исключение. На самой веб-странице элемент ввода является интерактивным, и я могу написать в нем любой текст.
Есть ли более одного элемента с этим идентификатором? Может быть более одного, где первый не тот, который вам нужен.
попробуйте inputTxt.location_once_scrolled_into_view, который будет прокручивать элемент в поле зрения. Тогда попробуйте send_keys.
@JeffC спасибо за вашу помощь, я проверил исходный код страницы и нашел три других элемента с точно таким же идентификатором, но в разных разделах с разными идентификаторами и классами. Теперь я должен попытаться сосредоточиться на одном из них, но проблема в том, как я могу определить для него настоящий css-селектор. Я использовал inputTxt=browser.find_element_by_css_selector('app-content#txt_search') (поле ввода, которое я хочу с id='txt_search', находится внутри тега содержимого приложения), но оно выдает NoSuchElementException, я не понимаю, какой правильный стиль для доступа к этому элементу?
Когда вы пишете селектор CSS app-content#txt_search, это означает, что HTML похож на <app-content id='txt_search'>...</app-content>. Соединение вместе без промежутка между ними означает, что все они являются частью одного и того же элемента. Вам нужно либо app-content > #txt_search (> указывает на дочерний элемент), либо app-content #txt_search (<пробел> указывает на потомка). Из HTML-кода, опубликованного в вашем вопросе, я предполагаю, что вам нужно место, потому что я не вижу родительского тега <app-content>.
Эта ссылка CSS поможет: w3.org/TR/селекторы/#обзор. Также Советы по Selenium: CSS-селекторы и Приручение расширенных селекторов CSS.
Попробуйте использовать этот xpath //div[@id = "btnSearchStockAutoComplete"]/parent::div[@class = "container"]//input[@id = "txt_search"].. потому что трудно найти этот элемент однозначно, используя cssSelector, если есть несколько элементов с одинаковым id.
@JeffC Большое спасибо за вашу помощь, я использовал пространство между элементами, и у меня это сработало отлично.
Здорово. Я разместил свой комментарий как ответ, так как он решил вашу проблему.






Когда вы пишете селектор CSS app-content#txt_search, это означает, что HTML похож на <app-content id='txt_search'>...</app-content>. Соединение вместе без промежутка между ними означает, что все они являются частью одного и того же элемента. Вам нужно либо app-content > #txt_search (> указывает на ребенка), либо app-content #txt_search (указывает на потомка). Из HTML-кода, опубликованного в вашем вопросе, я предполагаю, что вам нужно место, потому что я не вижу родительского тега <app-content>.
Вам нужно взаимодействовать со страницей, чтобы активировать текстовое поле поиска? Ошибка предполагает, что элемент существует, но не является «взаимодействующим».