Щелкните ссылку с частичным разделением, используя python selenium

#javascript #python #selenium #selenium-webdriver

#javascript #python #selenium #selenium-webdriver

Вопрос:

Я хочу собрать некоторую информацию на этом веб-сайте: https://www.caixabank.es/particular/prestamos-personales/prestamos.html

Я закодировал, чтобы перейти на страницу моделирования, но ссылка выводит меня из строя.

динамическая ссылка

Я не могу щелкнуть по этой ссылке.

Моя целевая страница — это та

целевая страница

Мой код:

 from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--start-maximized')
chrome_options.add_argument('window-size=5000x2500')
webdriver = webdriver.Chrome('chromedriver',chrome_options=chrome_options)
 
now = DT.now()
periode = str(now.day)   '_'   str(now.month)   '_'   str(now.year)
#url = "https://www.caixabank.es/particular/prestamos-personales/prestamos.html"
url = "https://loc2.caixabank.es/GPeticiones?CANAL=Iamp;DEMO=0amp;PN=LGNamp;PE=116amp;ENTORNO=1amp;sinCampanya=Samp;INICIAL_PN=PPPamp;INICIAL_PE=832amp;E_COD_LANDING=WGN00645amp;E_PNMENU=POSamp;E_PEMENU=6amp;TEXTO_OPE=prestamoestrellaautoes.txtamp;IDIOMA=02"
webdriver.get(url)
link = webdriver.find_element_by_partial_link_text('Demostración')
actions = ActionChains(webdriver).click(link)
actions.perform()
time.sleep(5)
webdriver.save_screenshot('sreenshot.png')
webdriver.implicitly_wait(30)
webdriver.switch_to.frame(webdriver.find_element_by_css_selector('#FramesetInferiorInterno > frame:nth-child(2)'))
webdriver.find_element_by_xpath("//a[contains(., 'Aceptar y continuar')]")
webdriver.save_screenshot('sreenshot1.png')
  

Ошибка, которую я получил, такова:

 /usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:8: DeprecationWarning: use options instead of chrome_options
  

---------------------------------------------------------------------------

NoSuchElementException                    Traceback (most recent call last)

<ipython-input-81-858e6e0c3de3> in <module>()
     29 webdriver.save_screenshot('sreenshot.png')
     30 webdriver.implicitly_wait(30)
---> 31 webdriver.switch_to.frame(webdriver.find_element_by_css_selector('#FramesetInferiorInterno > frame:nth-child(2)'))
     32 #webdriver.switch_to.frame('Cos')
     33 #link = webdriver.find_element_by_partial_link_text('Aceptar y continuar')

/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py in find_element_by_css_selector(self, css_selector)
    596             element = driver.find_element_by_css_selector('#foo')
    597         """
--> 598         return self.find_element(by=By.CSS_SELECTOR, value=css_selector)
    599 
    600     def find_elements_by_css_selector(self, css_selector):

/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py in find_element(self, by, value)
    976         return self.execute(Command.FIND_ELEMENT, {
    977             'using': by,
--> 978             'value': value})['value']
    979 
    980     def find_elements(self, by=By.ID, value=None):

/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py in execute(self, driver_command, params)
    319         response = self.command_executor.execute(driver_command, params)
    320         if response:
--> 321             self.error_handler.check_response(response)
    322             response['value'] = self._unwrap_value(
    323                 response.get('value', None))

/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/errorhandler.py in check_response(self, response)
    240                 alert_text = value['alert'].get('text')
    241             raise exception_class(message, screen, stacktrace, alert_text)
--> 242         raise exception_class(message, screen, stacktrace)
    243 
    244     def _value_or_default(self, obj, key, default):

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"#FramesetInferiorInterno > frame:nth-child(2)"}
  (Session info: headless chrome=72.0.3626.121)
  (Driver info: chromedriver=72.0.3626.121,platform=Linux 4.14.79  x86_64)
  

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

1. Не меняйте вопрос сейчас. На вопрос был дан ответ. Смотрите мой комментарий ниже.

2. Вопрос еще не решен 🙂

3. Мой вопрос в том, как щелкнуть по ссылке. Я все еще не могу ее получить.

4. Потому что вы больше не получаете сообщение об ошибке, которое вы опубликовали … которое в настоящее время все еще находится в вашем вопросе. Вам нужно очистить код в вашем вопросе. Удалите весь закомментированный код и опубликуйте текущий код, который вы используете, вместе с текущим сообщением об ошибке.

5. Вам нужно указать фрейм в качестве WebElement. Я думаю, что нужный вам фрейм можно найти таким образом: webdriver.switch_to.frame(webdriver.find_element_by_css_selector('#FramesetInferiorInterno > frame:nth-child(2)'))

Ответ №1:

Я думаю, вам, вероятно, просто нужны круглые скобки вокруг вашего xpath вместо скобок:

 webdriver.find_element_by_xpath("//a[contains(., 'Aceptar y continuar')]")
  

Это работает?

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

1. К сожалению, нет исключения NoSuchElementException: Сообщение: нет такого элемента: Не удается найти элемент: {«метод»:»xpath», «селектор»:»//a[содержит(., ‘Aceptar y continuar’)]»}

2. Итак, это исправило вашу ошибку, она просто выдала вам новую. Ссылка не была найдена, потому что она находится в IFRAME , поэтому вам придется переключиться на нее, прежде чем вы сможете найти свой элемент.

3. Я думаю, что новая ошибка исходит от (EC.element_to_be_clickable . Я думаю, вам нужно определить EC = ExpectedConditions , хотите ли вы использовать это таким образом. Однако, я думаю, что если вы просто добавите следующее к своему импорту, вам может быть полезно перейти: from selenium.webdriver.support import expected_conditions as EC

4. @JeffC Я попытался переключиться на Iframe. Но не сработало. Не могли бы вы, пожалуйста, опубликовать пример?

5. В Интернете есть множество примеров, я уверен, что если вы поищете, вы сможете найти один.