#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. В Интернете есть множество примеров, я уверен, что если вы поищете, вы сможете найти один.