Поиск элемента с веб-сайта с использованием classname, css-selector и xpath - PullRequest
1 голос
/ 04 июня 2019

Мне нужна помощь с моим кодом.

Я пытаюсь распечатать элемент с веб-сайта, но я получаю разные сообщения об ошибках от методов, которые я пробую, ни один из них не работает.

Я пытался использовать имя_класса со следующим кодом:

from selenium import webdriver    
browser = webdriver.Chrome('/home/cena/Downloads/chromedriver')

poeisz_url = "https://webwinkel.poiesz-supermarkten.nl/boodschappen/producten/631258"
poeisz_classname = "full-product full-product--price__for"

browser.get(poeisz_url)
elem = browser.find_element_by_class_name(poeisz_classname)
print(elem.text)

это вернуло следующее сообщение об ошибке:

Traceback (most recent call last):
  File "/home/cena/.PyCharmCE2019.1/config/scratches/scratch_2.py", line 9, in <module>
    elem = browser.find_element_by_class_name(poeisz_classname)
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 564, in find_element_by_class_name
    return self.find_element(by=By.CLASS_NAME, value=name)
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 978, in find_element
    'value': value})['value']
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidSelectorException: Message: invalid selector: Compound class names not permitted
  (Session info: chrome=74.0.3729.169)
  (Driver info: chromedriver=74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}),platform=Linux 4.15.0-50-generic x86_64)

Итак, я попытался использовать xpath и css_selector, чтобы обойти это:

from selenium import webdriver

browser = webdriver.Chrome('/home/cena/Downloads/chromedriver')

poeisz_url = "https://webwinkel.poiesz-supermarkten.nl/boodschappen/producten/631258"
poeisz_classname = "full-product full-product--price__for"

browser.get(poeisz_url)
elem = browser.find_element_by_xpath("//*[@class='" + poeisz_classname + "']")
print(elem.text)
from selenium import webdriver

browser = webdriver.Chrome('/home/cena/Downloads/chromedriver')

poeisz_url = "https://webwinkel.poiesz-supermarkten.nl/boodschappen/producten/631258"
poeisz_classname = "full-product full-product--price__for"

browser.get(poeisz_url)
elem = browser.find_element_by_css_selector("*[class^='" + poeisz_classname + "']")
print(elem.text)

они по порядку вернули эти ошибки:

Traceback (most recent call last):
  File "/home/cena/.PyCharmCE2019.1/config/scratches/scratch_2.py", line 9, in <module>
    elem = browser.find_element_by_xpath("//*[@class='" + poeisz_classname + "']")
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 394, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 978, in find_element
    'value': value})['value']
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.7/dist-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":"//*[@class='full-product full-product--price__for']"}
  (Session info: chrome=74.0.3729.169)
  (Driver info: chromedriver=74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}),platform=Linux 4.15.0-50-generic x86_64)
Traceback (most recent call last):
  File "/home/cena/.PyCharmCE2019.1/config/scratches/scratch_2.py", line 9, in <module>
    elem = browser.find_element_by_css_selector("*[class^='" + poeisz_classname + "']")
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 598, in find_element_by_css_selector
    return self.find_element(by=By.CSS_SELECTOR, value=css_selector)
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 978, in find_element
    'value': value})['value']
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.7/dist-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":"css selector","selector":"*[class^='full-product full-product--price__for']"}
  (Session info: chrome=74.0.3729.169)
  (Driver info: chromedriver=74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}),platform=Linux 4.15.0-50-generic x86_64)

Я довольно новичок в программировании, поэтому извините, если это что-то глупое. Заранее спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Вы должны использовать WebDriverWait:

например XPath:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


driver = webdriver.Chrome('/home/cena/Downloads/chromedriver')
url = "https://webwinkel.poiesz-supermarkten.nl/boodschappen/producten/631258"
driver.get(url)
my_el = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '//div[@id="products"]//*[@class="full-product full-product--price__for"]')))
print(my_el.text)

Вывод:

0 99

Лучший способ использовать WebDriverWait - использовать его как переменную:

wait = WebDriverWait(driver, 20)
my_el = wait.until(EC.presence_of_element_located((By.XPATH, '//div[@id="products"]//*[@class="full-product full-product--price__for"]')))

Как прокомментировал @ DebanjanB , вы можете использовать visibility_of_element_located(), а не presence_of_element_located.

Надеюсь, это поможет вам!

0 голосов
/ 04 июня 2019

Проблема, с которой вы столкнулись, объясняется в первом сообщении об ошибке.

неверный селектор: составные имена классов не разрешены

find_element_by_class_name() принимает одиночное имя класса в качестве параметра, но «полный продукт полный продукт - цена__for» содержит два имени класса (ПРИМЕЧАНИЕ: имена классов разделены пробелами, поэтому есть два здесь ... "полный продукт" и "полный продукт - цена __for".

Вместо этого вы можете преобразовать свой локатор в селектор CSS, .full-product.full-product--price__for, и он должен работать просто отлично.

Подробнее о селекторах CSS см. По ссылкам ниже.

Советы по селену: CSS селекторы
ссылка WC3, уровень селекторов 4
Укрощение расширенных селекторов CSS

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