Динамический веб-сайт находит элемент по имени класса и выполняет метод 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
Другие вопросы по тегам