Selenium не может найти элемент по идентификатору на верхнем сайте Python - PullRequest
0 голосов
/ 28 мая 2018

Я создаю бота, который покупает предметы с превосходного веб-сайта, используя библиотеку selenium для python 3.5.Бот может успешно добавить товар в корзину, но в процессе оформления заказа селен выдает ошибку всякий раз, когда пытается отправить ключи элементу ввода, найденному методом find_element_by_id().Вот упрощенная версия кода, который выдает ошибку.

from selenium import webdriver
d = webdriver.Chrome()
# First it adds an item to the cart
d.get('http://www.supremenewyork.com/shop/tops-sweaters/vxdau6b3t/km1pzdca3')
d.find_element_by_name('commit').click()
# Then it goes to the checkout
d.get('https://www.supremenewyork.com/checkout')
name_box = d.find_element_by_id('order_billing_name')
# This is the line that throws the error
name_box.send_keys('name goes here')

Вот полное сообщение об ошибке.

File "error.py", line 7, in <module>
    name_box.send_keys('name goes here')
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/selenium/webdriver/remote/webelement.py", line 479, in send_keys
    'value': keys_to_typing(value)})
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/selenium/webdriver/remote/webelement.py", line 628, in _execute
    return self._parent.execute(command, params)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py", line 312, in execute
    self.error_handler.check_response(response)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: Failed to execute 'getComputedStyle' on 'Window': parameter 1 is not of type 'Element'.
  (Session info: chrome=66.0.3359.181)
  (Driver info: chromedriver=2.35.528157 (4429ca2590d6988c0745c24c8858745aaaec01ef),platform=Mac OS X 10.13.3 x86_64)

Когда я заменяю строку name_box = d.find_element_by_id('order_billing_name') на строку d.find_element_by_xpath("//input[@id='order_billing_name']")код работает как задумано.Однако это не является жизнеспособным решением, так как при нахождении элемента таким способом метод send_keys() очень медленный.Спасибо за помощь!

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Давайте попробуем сделать это правильно (конечно, есть много вещей, которые можно улучшить, но я постарался сделать это кратким. Пожалуйста, проверьте комментарии в строке

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

driver = webdriver.Chrome()

# First it adds an item to the cart
driver.get('http://www.supremenewyork.com/shop/tops-sweaters/vxdau6b3t/km1pzdca3')

# wait until cart link is available
add_to_cart = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, "[name=commit]"))
)
# add to cart
add_to_cart.click()

# wait until checkout link is available
go_to_cart = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, "div#cart:not(.hidden) a.checkout"))
)

# Then it goes to the checkout
go_to_cart.click()

# wait until name input is available
name_input = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, "div.order_billing_name"))
)

# we can't select pseudo elements with css selector, but we can click on an element 
# above it, which is defined in "name_input", and emulate keypresses,
# which are intended for the selected ("click()") element only

actions = ActionChains(driver)
actions.move_to_element(name_input).click().send_keys("hey 123").perform()

driver.quit()
0 голосов
/ 28 мая 2018

Это сообщение об ошибке ...

selenium.common.exceptions.WebDriverException: Message: unknown error: Failed to execute 'getComputedStyle' on 'Window': parameter 1 is not of type 'Element'.

... означает, что WebDriverException было вызвано, когда драйвер пытался вызвать send_keys() для элемента, обозначенного как d.find_element_by_id('order_billing_name').

Есть пара вещей, которые вам, возможно, придется решить следующим образом:

  • @ yong Первоначальный анализ был в правильном направлении, поскольку, кажется, есть некоторые несовместимость в двоичных версиях.

    • Вы используете chromedriver = 2,35
    • Примечания к выпуску chromedriver= 2,35 четко упоминается следующее:

    • Опоры Chrome v62-64

    • Вы используете chrome = 66.0

    • Примечания к выпуску ChromeDriver v2.38 четко упоминаетследующие:

    • Поддержка Chrome v65-67

  • Asза Не удалось выполнить 'getComputedStyle 'on' Window ': параметр 1 не относится к типу' Element ' ошибка наблюдается, когда стиль / скрипт данных внешнего интерфейса пуст или css пуст. .По сути это означает, что Стратегия локатора , которую вы использовали как:

    d.find_element_by_id('order_billing_name')
    
    • Не идентифицирует ваш желаемый элемент, но идентифицирует какой-либо другой элемент, который является hidden или readonly.
    • Когда вы получаете детальный поиск, ваш код работает так, как если бы он уникальным образом идентифицировал нужный элемент, как:

      d.find_element_by_xpath("//input[@id='order_billing_name']")
      
  • send_keys() метод очень медленный обязательно будет устранен, как только несовместимость версий проблема решена.

0 голосов
/ 28 мая 2018

В соответствии с chromedriver изменить примечание , пожалуйста, обновите ваш chromedriver до 2.37 или 2.38, который более совместим с Chrome 66.

...