NoSuchElementException: Сообщение: невозможно найти элемент при попытке нажать на кнопку VISA через Selenium и Python - PullRequest
0 голосов
/ 03 марта 2019

Я не могу нажать на эту кнопку, чтобы оформить заказ на моего бота.Я хочу нажать на изображение, чтобы получить другую страницу.

<label for="VISA" class="choiceLabel">
            
				<input type="radio" class="visuallyhidden" name="cardTypeRadio" id="VISA" value="VISA" title="VISA" onclick="validateAndSubmit('VISA');">
					<span class="imgElt xh-highlight" onclick="validateAndSubmit('VISA');">
              	<img src="/static/2.15.0.1/images/type-carte/visa.png" alt="VISA" title="Visa">
            	</span>
            <span class="txtElt">Visa</span>
          </label>
это мой код:

try:
             check = WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.ID,"VISA" )))
            
             print ("Page is ready!")
             visa = driver.find_elements_by_xpath("label[@class='choiceLabel'][4]")
             visa.click()


        except TimeoutException:
             print ("Loading took too much time!")
             return check

я получаю эту ошибку:

 File "C:\Users\x\AppData\Local\Programs\Python\Python37\lib\threading.py", line 917, in _bootstrap_inner
    self.run()
  File "C:\Users\x\AppData\Local\Programs\Python\Python37\lib\threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
  File "c:/Users/pietro/Documents/monitor/x/bot.py", line 48, in all
    visa = driver.find_element_by_xpath("label[@class='choiceLabel'][4]")
  File "C:\Users\x\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 394, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "C:\Users\x\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
    'value': value})['value']
  File "C:\Users\x\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\x\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: label[@class='choiceLabel'][4]

Ответы [ 3 ]

0 голосов
/ 03 марта 2019

Возможно, ваш xpath неправильный. Попробуйте приведенный ниже код. Надеюсь, это поможет.

driver.find_element_by_xpath("//input[@name='cardTypeRadio']").click()

ИЛИ

driver.find_element_by_xpath("//input[@id='VISA']").click()

Если webdriver щелчок не работает. ПопробуйтеJavaScript для нажатия.

driver.execute_script("arguments[0].click();", driver.find_element_by_xpath("//input[@name='cardTypeRadio']"))

driver.execute_script("arguments[0].click();", driver.find_element_by_xpath("//input[@id='VISA']"))
0 голосов
/ 03 марта 2019

Кнопка для создания заказа на моем боте выглядит как поле Кредитная карта и исторически Кредитная карта связанные поля находятся в <iframe>.

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

Так что, если нужный элемент находится в пределах<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[for='VISA']"))).click()
      
    • Использование 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[@for='VISA']"))).click()
      
  • Примечание : необходимо добавить следующий импорт:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
0 голосов
/ 03 марта 2019

xPath, который вы ищете, может выглядеть примерно так:

//input[@name='cardTypeRadio' and @value='VISA']

Если это не даст вам уникальный элемент, мы можем немного его уточнить.

...