Нажмите на указанную c кнопку с селеном - PullRequest
0 голосов
/ 26 марта 2020

Python, Selenium, XPath.

Я хочу открыть эту страницу https://www.tesla.com/en_gb/models/design#battery и программно нажать кнопку исполнения с python.

Здесь это то, что я хочу нажать: изображение, показывающее, на что я хочу нажать

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

Вот что я пробовал

from selenium import webdriver
browser = webdriver.Chrome('../Downloads/chromedriver.exe')
browser.get('https://www.tesla.com/en_gb/models/design#battery')
A = browser.find_element_by_xpath('/html/body/div/div/main/div/div/div[2]/div[5]/div/div[1]/div/div[2]/div[2]/div[1]')
A.click();

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

Traceback (most recent call last):
File "C:\Users\User\Desktop\666.py", line 4, in <module>
A = browser.find_element_by_xpath('/html/body/div/div/main/div/div/div[2]/div[5]/div/div[1]/div/div[2]/div[2]/div[1]')
File "C:\Users\User\AppData\Local\Programs\Python\Python37-32\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\User\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
'value': value})['value']
File "C:\Users\User\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:\Users\User\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div/div/main/div/div/div[2]/div[5]/div/div[1]/div/div[2]/div[2]/div[1]"}
(Session info: chrome=80.0.3987.149)

full xpath {/ html / body / div / div / main / div / div / div [2] / div [5] / div / div 1 / div / div [2] / div [2] / div 1 }

html элемента, на который я хочу нажать

<div role="button" tabindex="0" class="group--options_block m3-animate--all" aria-label="Performance"><div class="group--options_block_title"><span><p class="group--options_block--name text-loader--content" tabindex="-1">Performance</p></span><p class="group--options_block-container_price text-loader--content price-not-included">£95,800</p></div></div>

, я копирую и вставляю полный xpath элемента, который хочу. Разве это не правильный способ сделать это?

edit: если он работает, диапазон должен быть 367, а не 379

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Используйте следующий xpath

//div[@class='group--options_block_title']/span/p

ИЛИ

//p[contains(text(),'Performance')]

ИЛИ CSS селектор

div[aria-label='Performance']

Не забудьте ввести Implicit или Explicit подождите, чтобы избежать проблем с синхронизацией в ваших скриптах. ссылка

0 голосов
/ 26 марта 2020

Пожалуйста, ознакомьтесь с кодом ниже, иногда сайты загружаются слишком долго, поэтому было бы неплохо, если бы вы использовали WebDriverWait в своем решении. Также не рекомендуется использовать Abs XPath.

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import time
driver = webdriver.Chrome(executable_path=r"C:\New folder\chromedriver.exe")

driver.get('https://www.tesla.com/en_gb/models/design#battery')
wait = WebDriverWait(driver,30)
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//p[contains(text(),'Performance')]")))
print element.text
element.click()
element1 = wait.until(EC.presence_of_element_located((By.XPATH, "//span[contains(text(),'367')]")))
print element1.text

Вывод: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...