Selenium send_keys в iframe, python

#python #selenium

#python #селен

Вопрос:

У меня возникла эта серьезная проблема send_keys() , когда я пытаюсь использовать iframe. Фрагмент моего HTML-кода выглядит следующим образом…

 <iframe sandbox="allow-scripts allow-same-origin" class="credit-card-iframe-cvv mt1 u-full-width" src="https://paymentcc.nike.com/services/cvv?id=5abb5718-573e-40a0-bf29-40ab3b9de9d2amp;amp;ctx=checkoutamp;amp;language=undefinedamp;amp;maskerEnabled=true" frameborder="0" scrolling="no" title="Credit Card CVV Form"></iframe>

    <html content="text/html;charset=UTF-8"><head>
        <meta content="text/html; charset=utf-8" http-equiv="content-type">
        <link rel="stylesheet" href="//assets.commerce.nikecloud.com/ncss/glyphs/2.0/css/glyphs.min.css">
        <link rel="stylesheet" href="//assets.commerce.nikecloud.com/ncss/0.16/dotcom/desktop/css/ncss.en-us.min.css">
    
          <link href="/resources/css/all.min.css?v=1601382771491" rel="stylesheet">
    </head>
    <body>
    
      <form id="creditCardForm" method="post">
    
        <div class="ncss-input-container mod-cvv-input error">
          <label class="ncss-label mr2-sm" for="cvNumber">Security Code</label>
          <input type="tel" id="cvNumber" tabindex="0" data-shortname="cvv" maxlength="4" placeholder="XXX" class="mod-input ncss-input pt2-sm pr4-sm pb2-sm pl4-sm" autocomplete="off" value="">
        </div>
    
          <input type="hidden" id="parentDomain" value="https://www.nike.com">
          <input type="hidden" id="enableIFrameBuster" value="false">
    
      </form>
    
            <script src="/resources/js/masker.js"></script>
            <script src="/resources/js/common.js"></script>
    
    
    </body></html>
  

Я пытался переключить свой драйвер на iframe и выбрать xpath желаемого пути для send_keys. Моя попытка кода…

 #also tried with xpath
element = driver.find_element_by_class_name("credit-card-iframe-cvv mt1 u-full-width")
driver.switch_to_frame(element)
queryElement = driver.find_element_by_xpath("/html/body/form/div/input")
queryElement.send_keys("123")
  

Что мне делать? Также я пытаюсь отправить send_keys <input type="tel" id="cvNumber" tabindex="0" data-shortname="cvv" maxlength="4" placeholder="XXX" class="mod-input ncss-input pt2-sm pr4-sm pb2-sm pl4-sm" autocomplete="off" value=""> , не знаю, поможет ли это.

Также это моя ошибка, которую я получаю.

 NoSuchElementException: no such element: Unable to locate element: {"method":"css selector","selector":".credit-card-iframe-cvv mt1 u-full-width"}
  (Session info: chrome=85.0.4183.121) 
  

Комментарии:

1. @arundeepchohan извините, хотел опубликовать это.

2. О, у вас проблема с составными классами. На самом деле это несколько классов. Используйте селектор css. «frame.credit-card-iframe-cvv.mt1.u-во всю ширину»

3. У меня возникла эта серьезная проблема , было бы полезно, если бы вы сказали, в чем проблема. Если вы получаете сообщение об ошибке, пожалуйста, опубликуйте его.

4. Почему вы используете xpath для поиска элемента ввода? Поиск по идентификатору лучше, не так ли?

5. Нет идентификатора для поиска, его проблема заключалась в использовании поиска по классу для поиска составных классов.

Ответ №1:

Для iframe этого вы можете использовать этот селектор .credit-card-iframe-cvv.mt1.u-full-width

И для input того, что вы можете найти id , например, так:

 element = driver.find_element_by_css_selector('.credit-card-iframe-cvv.mt1.u-full-width')
driver.switch_to.frame(element)

queryElement = driver.find_element_by_id('cvNumber')
queryElement.send_keys('123')
  

Ответ №2:

Главное — извлечь фрейм. Вы можете сделать это несколькими способами, например, с помощью xpath, селектора css, а также имени тега.

Фрагмент с использованием xpath :

 driver.find_element_by_xpath(//iframe[@sandbox='allow-scripts allow-same-origin'])
  

Фрагмент с использованием селектора CSS:

 driver.find_element_by_css_selector(".allow-scripts.allow-same-origin")
  

Фрагмент с использованием имени тега:

 driver.find_element_by_tag_name('iframe')
  

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