Элемент не активен, потому что другой элемент скрывает его - PullRequest
0 голосов
/ 11 февраля 2019

функция:

def twoclicks(idoutter,idinner):
    wait = WebDriverWait(driver, 20)
    wait.until(EC.element_to_be_clickable((By.XPATH, "//input[contains(@id," + idoutter + ") and @value='...']"))).click()
    sleep(5)
    wait.until(EC.element_to_be_clickable((By.ID, idinner))).click()

Эта функция используется, чтобы щелкнуть элемент, затем всплыть через несколько секунд и щелкнуть элемент всплывающего окна.

Я продолжаю получать этоошибка, хотя я пытался добавить sleep() в свою функцию, и это противоречиво, так как иногда я получаю его, а другие нет.

Моя предыдущая функция была:

def twoclicks(idoutter,idinner):
    outter = driver.find_element_by_xpath("//input[contains(@id," + idoutter + ") and @value='...']")
    outter.click()
    sleep(10)
    driver.find_element_by_id(idinner).click()
     sleep(7)

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

пожалуйста, обратите внимание, что код является непрерывным вызовом для подобных функций, таких как:

twoclicks("'button1'", 'button2')
twoclicks("'button3'", 'button4')

Непонятное для div это:

<div class="rich-mpnl-mask-div-opaque rich-mpnl-mask-div" id="PWBFormID:managerModalPanelDiv" style="z-index: -1;"><button class="rich-mpnl-button" id="PWBFormID:managerModalPanelFirstHref"></button></div>

в html-файле серого цвета (при проверке).

Я видел много методов, таких как использование execute_script() для блокировки div с разделяемым классом выше, но проблема в том, что я использую функцию для него и имею десятки кнопок, которые не будут иметь этой проблемы или потенциально могут иметьэто с другойКласс аренды, который делает избавление от таких случаев без написания вручную кода для них отдельно для каждого случая за пределами моей twoclicks() функции очень трудным.

1 Ответ

0 голосов
/ 15 февраля 2019

Вы можете попытаться дождаться завершения Javascript.Попробуйте метод ожидания ниже:

def waitforload():
    wait.until(lambda d: d.execute_script(
        'return (document.readyState == "complete" || document.readyState == "interactive")'))


def twoclicks(idoutter, idinner):
    wait.until(EC.element_to_be_clickable((By.XPATH, "//input[contains(@id," + idoutter + ") and @value='...']"))).click()
    waitforload()
    wait.until(EC.element_to_be_clickable((By.ID, idinner))).click()
    waitforload()
...