Сайт Dynami c находит элемент по имени класса и выполняет метод onclick, связанный с классом, в Python с Selenium и Chrome - PullRequest
1 голос
/ 08 января 2020

Я работаю над драйверами Python, Selenium и Chrome. У меня есть динамический c веб-сайт, и каждый раз, когда сайт загружает, меняются идентификаторы, поэтому я не могу использовать 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 Ответ

0 голосов
/ 08 января 2020

Индуцирование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...