Selenium Python Невозможно найти элемент - PullRequest
1 голос
/ 11 марта 2019

Я пытаюсь собрать информацию о ценах для каждого варианта продукта на этой веб-странице: https://www.safetysign.com/products/7337/ez-pipe-marker

Я использую Selenium и FireFox с Python 3 и Windows 10.

Здесьмой текущий код:

driver = webdriver.Firefox()
driver.get('https://www.safetysign.com/products/7337/ez-pipe-marker')
#frame = driver.find_element_by_class_name('product-dual-holder')
# driver.switch_to.frame('skuer5c866ddb91611')
# driver.implicitly_wait(5)
driver.find_element_by_id('skuer5c866ddb91611-size-label-324').click()   
price = driver.find_element_by_class_name("product-pricingnodecontent product-price-content").text.replace('$', '')
products.at[counter, 'safetysign.com Price'] = price
print(price)
print(products['safetysign.com URL'].count()-counter)

Итак, я пытаюсь начать, просто выбрав первый вариант продукта по идентификатору (я также попробовал название класса).Но я получаю Невозможно определить местонахождение ошибки элемента.Как предлагалось в многочисленных сообщениях SO, я пытался изменить фреймы (хотя я не могу найти тег фрейма в html, который содержит этот элемент).Я попытался переключиться на разные фреймы, используя индекс, имя класса и id разных элементов div, которые, как я думал, могут быть фреймами, но ничего из этого не сработало.Я также пытался использовать ожидание, но это возвращает ту же ошибку.

Есть идеи, что я пропускаю или делаю неправильно?

Ответы [ 2 ]

1 голос
/ 11 марта 2019

Чтобы найти элементы, вы должны вызвать WebDriverWait для visibility_of_all_elements_located(), и вы можете создать Список и выполнить итерации по нему для click() каждого элемента, и вы можете использовать следующее решение:

  • Кодовый блок:

    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.Firefox(executable_path=r'C:\Utility\BrowserDrivers\geckodriver.exe')
    driver.get("https://www.safetysign.com/products/7337/ez-pipe-marker")
    for product in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//form[@class='product-page-form']//div[@class='sku-contents']//following::ul[1]/li//label[starts-with(@for, 'skuer') and contains(., 'Pipe')]"))):
        WebDriverWait(driver, 20).until(EC.visibility_of(product)).click()
    driver.quit()
    
0 голосов
/ 11 марта 2019

Они вполне могут быть динамичными. Вместо этого выберите с помощью селектора типа label и индекс, чтобы щелкнуть необходимый элемент, например, 0 для элемента, который вы упоминаете (первый в списке). Кроме того, добавьте условие ожидания для label s, чтобы присутствовать.

Если вы хотите ограничиться только этими 5 size вариантами, тогда используйте следующий селектор CSS вместо label:

.sku-contents ul:nth-child(3) label

1010 * т.е. *

sizes = WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".sku-contents ul:nth-child(3) label")))
sizes[0].click()

После выбора размера вы можете получить цену из ценового узла в зависимости от того, хотите ли вы цену для данного размера выборки, например, 0-99.

Для получения окончательной цены используйте:

.product-under-sku-total-label

Код:

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
url = 'https://www.safetysign.com/products/7337/ez-pipe-marker'
driver = webdriver.Chrome()
driver.get(url)
labels = WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "label")))
labels[0].click()
price0to99 = driver.find_element_by_css_selector('.product-pricingnodecontent').text
priceTotal = driver.find_element_by_css_selector('.product-under-sku-total-label').text
print(priceTotal, price0To99)
# driver.quit()
...