Динамический веб-сайт находит элемент по имени класса и выполняет метод onclick, связанный с классом в Python с помощью Selenium и Chrome.
Я работаю над драйвером Python, Selenium и Chrome. У меня динамический веб-сайт, и каждый раз, когда сайт загружается, идентификаторы меняются, поэтому я не могу использовать Xpath. Но я могу использовать имя класса. Я могу попасть в класс, как показано ниже; Ниже приведен код сайта.
<a class="appButton registerItemSearch-tabs-criteriaAndButtons-buttonPad-search appSearchButton appPrimaryButton appButtonPrimary appSubmitButton appNotReadOnly appIndex2" id="nodeW830" href="#" onclick="return function(me){var retVal = false; if (catHtmlFragmentCallback('W830','buttonPush',null,{asyncUpdate:true,containerSelector:'#AsyncWrapperW814',containerNodeId:'W814',success:function(html){jQuery('#AsyncWrapperW814').empty().append(html);webuiAsyncOk('#AsyncWrapperW814');}}, me) == 'skip') retVal = true;return retVal;}(this)" tabindex="118"><span class="left"></span><span class="appReceiveFocus" tabindex="-1">Search</span><span class="right"></span></a>
Однако я могу сделать следующее; чтобы добраться до элемента.
xxx = driver.find_elements_by_class_name("appButton.registerItemSearch-tabs-criteriaAndButtons-buttonPad-search.appSearchButton.appButtonPrimary.appPrimaryButton.appSubmitButton.appNotReadOnly.appIndex2")
Теперь я хочу выполнить метод onclick, связанный с классом. Я тоже могу это сделать, как показано ниже;
driver.execute_script("return function(me){var retVal = false; if (catHtmlFragmentCallback('W830','buttonPush',null,{asyncUpdate:true,containerSelector:'#AsyncWrapperW814',containerNodeId:'W814',success:function(html){jQuery('#AsyncWrapperW814').empty().append(html);webuiAsyncOk('#AsyncWrapperW814');}}, me) == 'skip') retVal = true;return retVal;}(this)")
Но, как я уже упоминал, я не могу жестко запрограммировать значения driver.execute_script. Я должен получать значения динамически. Не могли бы вы мне помочь? Если вы можете предложить способ, я могу найти элемент по имени класса и выполнить метод onclick. или как я уже упоминал; Я могу найти элемент по имени класса, если я могу получить код (HTML), связанный с элементом, тогда я могу выполнить driver.execute_script. Не могли бы вы предложить путь вперед? Спасибо
1 ответ
Побудить WebDriverWait
а также element_to_be_clickable
() и следующий локатор.
Xpath:
WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,"//a[.//span[text()='Search']]"))).click()
Селектор CSS:
WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"a.appButton.registerItemSearch-tabs-criteriaAndButtons-buttonPad-search.appSearchButton.appPrimaryButton.appButtonPrimary.appSubmitButton.appNotReadOnly.appIndex2"))).click()
Вам необходимо импортировать следующие библиотеки.
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By