2016-08-29 1 views
0

Я создаю скрипт python с использованием селена и столкнулся с довольно запутанной проблемой.Selenium Python - Поиск div, содержащий два конкретных элемента

На веб-сайте перечислены продукты с уникальным именем, а также цвет, который не является уникальным. Элементы color и name имеют один и тот же родительский элемент.

Мой скрипт получает пользовательский ввод, на какой продукт он хочет, чтобы скрипт покупал для него и какой цвет.

Проблема: Я не могу за жизнь мне понять, как выбрать правильный продукт, используя две переменные ProductName и productColor.

DOM:

<div class="inner-article"> 
    <h1> 
    <a class="product-name">Silk Shirt</a> 
    </h1> 
    <p> 
    <a class="product-color">Black</a> 
    </p> 
</div> 

Что я пытался до сих пор: Очевидно, что выбор первого продукта под названием Silk Shirt на странице довольно легко. Я решил выбрать первый продукт, а затем выбрать родительский продукт, выбрав родительские элементы, а затем выбрав второго родителя, проверяя, был ли он черным и продолжался, но CSS не имеет родительского селектора.

Как я могу это сделать?

ответ

1

Создайте основной цикл, который выбирает каждый элемент div class="inner-article".

В цикле, обратите внимание на элементы, которые имеют h1 дочерний элемент и a class=product-name внучат элемент с текстом «шелковая рубашка», а элемент а p ребенка и a class=product-color внучат элемент с текстом «Black».

+0

Спасибо, хорошая идея. Очень важно, чтобы сценарий выполнялся как можно быстрее. Считаете ли вы, что это замедлит сценарий более чем на секунду или два? – metadog

+0

Нет, я бы так не подумал. (Но .. сколько продуктов будет на странице?) –

+0

От 20 до 30, так что, надеюсь, это не проблема. Спасибо тонну за то, что нашли время, чтобы помочь мне! – metadog

0

Возможно, попробуйте выполнить поиск с использованием xpath. Ниже xpath возвращает элемент div, содержащий требуемый продукт и цвет.

driver.find_element_by_xpath('//div[@class="inner-article"][.//a[@class="product-name"][.="Silk Shirt"]][.//a[@class="product-color"][.="Black"]]') 

Чтобы сделать его многоразовым:

def select_product(name, color): 
    return driver.find_element_by_xpath('//div[@class="inner-article"][.//a[@class="product-name"][.="{product_name}"]][.//a[@class="product-color"][.="{product_color}"]]'.format(product_name=name, product_color=color))