ElementClickInterceptedException: Сообщение: нажатие элемента перехвачено. Элемент не доступен для щелчка. Ошибка при нажатии переключателя с использованием Selenium и Python. - PullRequest
1 голос
/ 14 июля 2020

Я пытаюсь щелкнуть первое поле (ASN / DSD)

enter image description here

But I get this error message:

selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: 
Element  не активен в точке (338, 202). Другой элемент получит щелчок: ...  (Информация о сеансе: chrome = 83.0.4103.116) 

Я знаю, что ввел правильный iframe, потому что он может найти элемент, но не щелкнуть в теме. Мой код:

driver.switch_to.default_content()
iframes = driver.find_elements_by_tag_name("iframe")
driver.switch_to.frame(iframes[0])
time.sleep(5)
driver.find_element_by_xpath('//*[@id="documentType-0"]').click()

Я видел, что DebanjanB ответил на аналогичный вопрос здесь: ссылка

Я пытаюсь сделать его третье решение с использованием сценария выполнения. Я не знаю, какой селектор CSS использовать для этой модели. Модель выглядит так:

WebDriverWait(driver, 20).until(EC.invisibility_of_element((By.CSS_SELECTOR, "span.taLnk.ulBlueLinks")))
driver.execute_script("arguments[0].click();", WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='loadingWhiteBox']"))))

Мой вопрос в том, какой селектор css мне нужно использовать в первой строке, а затем это просто исходный xpath, который я использовал во второй строке?

Вот HTML для справки. Я получаю ошибку перехвата щелчка, когда пытаюсь щелкнуть раздел ввода. Если использовать xpath для щелчка по тегу метки, он не вызывает ошибки, но и не щелкает по нему. Он просто переходит к следующему разделу кода, ничего не делая.

<li ng-repeat="documentType in selectDocumentType.documentTypes.displayedList |
orderBy:selectDocumentType.formOrder"> 

<input type="radio" name="docTypes" ng
model="selectDocumentType.documentTypes.selected" id="documentType-0" ng-value="documentType"
tabindex="0" class="ng-valid ng-not-empty ng-dirty ng-valid-parse ng-touched" value="[object Object]"
aria-invalid="false"> 

<label translate-attr="{title:'fulfillment.documentAction.createNew.modal.documentType.document.title'}" 
translate-values={documentName: documentType.name}" for="documentType-0" translate="ASN - DSD" tabindex="0" title=
"Select ASN - DSD document type"><span>ASN - DSD</span></label> </li>

Есть какие-нибудь предложения о том, как остановить перехват щелчка?

Выберите ASN - тип документа DSD

1 Ответ

1 голос
/ 15 июля 2020

Это сообщение об ошибке ...

selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: 
Element <input type="radio" name="docTypes" ng-model="$ctrl.documentTypes.selected" id="documentType-0" ng-change="$ctrl.onChangeDocumentType()" ng-value="documentType" tabindex="0" class="ng-pristine ng-untouched ng-valid ng-empty" value="[object Object]" aria-invalid="false"> 
is not clickable at point (338, 202). 
Other element would receive the click:
 <label translate-attr="{title: 'fulfillment.documentAction.createNew.modal.documentType.document.title'}" translate-values="{documentName: documentType.name}" for="documentType-0" translate="ASN - DSD" tabindex="0" title="Select ASN - DSD document type">...</label>

... подразумевает, что на нужный элемент нельзя было щелкнуть, поскольку какой-то другой элемент его скрывает.

Желаемый элемент - это элемент Angular, поэтому для вызова click() в элементе вы должны вызвать WebDriverWait для element_to_be_clickable(), и вы можете использовать любой из следующие Стратегии локатора :

  • Использование CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "label[for='documentType-0']"))).click()
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[@for='documentType-0']"))).click()
    
  • Примечание : вам необходимо добавить следующие импорты:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

Обновление

В качестве альтернативы вы можете использовать метод execute_script() следующим образом:

  • Использование CSS_SELECTOR:

    driver.execute_script("arguments[0].click();", WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "label[for='documentType-0']"))))
    
  • Использование XPATH:

    driver.execute_script("arguments[0].click();", WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[@for='documentType-0']"))))
    

Ссылки

Вы можете найти пару соответствующих обсуждений в:

...