Selenium Python - невозможно установить флажок внутри iframe, который привязан к метке со значениями, обновленными в скрытом элементе - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть страница формы для запроса доступа к одному или обоим из Password / RDP к серверу, используя флажки.RDP отмечен по умолчанию.Я тоже хочу проверить пароль.Форма имеет рамку, внутри которой есть

  • метка для текста "Запрос доступа"
  • div, который имеет
    • скрытый ввод, который принимает значение "2«по умолчанию * RDP всегда проверяется), но изменяется на« 2,1 », если также проверяется пароль
    • метка с текстом« Пароль », привязанная к входу, которая является флажком
    • aметка с текстом «RDP» привязана к входу, который является флажком

Я хочу нажать на первый флажок для Пароль .

Вот исходный код HTML:

<div class="control-group access-type">
    <label class="control-label" data-bind="text: translate('view_new_requests:access_request_lbl', { defaultValue: 'Access Request:'})">Access Request:</label>
    <div class="controls div-access-type" data-bind="visible: accessTypes().length > 0">
        <input type="hidden" id="hiRequestAccessType" data-bind="value: requestAccessTypeStr" value="2">
        <div class="retinaCS-validation-message" style="display: none; top: 210.812px; left: 183px; opacity: 0;">
            <em></em>
            <div style="display: table">
                <div class="retinaCS-validation-message-text" style="display: table-cell" data-bind="validationMessage: field"></div>
            </div>
        </div> 
        <!-- ko foreach: $root.accessTypes -->
        <label data-bind="css: 'checkbox' + '&nbsp;' + cssClassName()" class="checkbox viewpwd">
            <input name="rbtnAccessType" type="checkbox" data-bind="value: bitValue(), enable: enabled(), checked: $root.requestAccessTypeStr" value="1">
            <!-- ko text: title() -->Password<!-- /ko -->
        </label>
        <br>                                     
        <label data-bind="css: 'checkbox' + '&nbsp;' + cssClassName()" class="checkbox rdpaccess">
            <input name="rbtnAccessType" type="checkbox" data-bind="value: bitValue(), enable: enabled(), checked: $root.requestAccessTypeStr" value="2">
            <!-- ko text: title() -->RDP Session<!-- /ko -->
        </label>
        <br> 
        <!-- /ko -->
    </div>
    <div class="controls read-only-label" data-bind="visible: accessTypes().length == 0" style="display: none;">
        <span class="form-value-label" data-bind="text: translate('view_new_requests:no_accessTypes_lbl', { defaultValue: 'No access request types available. Contact your administrator.'})">No access request types available. Contact your administrator.
        </span>
    </div>                            
</div>

Примечание:

wait = ui.WebDriverWait(driver, 10)

где драйвер - это экземпляр Chromedriver.Кроме того, я переключился на вышеупомянутую рамку.

Я попробовал следующее:

1.Установив значение скрытого элемента в '2,1':

passwordcheck_input_element = driver.find_element_by_css_selector("#hiRequestAccessType")
new_value = '2,1'
driver.execute_script("arguments[0].value = arguments[1].toString()", passwordcheck_input_element, new_value)

2. Установите флажок непосредственно:

chckbox = wait.until(EC.element_to_be_clickable((By.NAME, "rbtnAccessType")))

ИЛИ

chckbox = driver.find_element_by_xpath("//label/input[contains(..,'Password')]")

, а затем

chckbox.click()

Это то, что я вижу:

1Значение успешно изменяется на «2,1», но поле для пароля не проверяется, поэтому ничего не происходит.Это только RDP, который выбирается на заднем конце при переходе на следующую страницу.

2. Ничего не произошло.Нет ошибки, но нет и флажка.Я думаю, что не нашел элемент флажка, но что-то еще.Если я запрашиваю chckbox.name, он возвращает ошибку о том, что у WebElement нет атрибута «name», где я ожидал увидеть «rbtnAccessType».

1 Ответ

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

Многое зависит от того, как вы переключились на вышеупомянутый фрейм .

Кажется, что HTML генерируется динамически, поэтому для идентификации и взаимодействия с нужным элементом в теге <iframe>вам необходимо:

  • вызвать WebDriverWait , чтобы требуемый кадр был доступен, и переключиться на него .
  • вызвать WebDriverWait для желаемого элемента , который можно нажимать .
  • Можно использовать одно из следующих решений:
  • Использование CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe_css_selector")))
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "label.viewpwd>input[name='rbtnAccessType'][value='1']")))
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"iframe_xpath")))
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[contains(@class,'viewpwd')]/input[@name='rbtnAccessType' and @value='1']")))
    
  • Примечание : необходимо добавить следующие импортные данные:

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

Ссылки:

...