2013-03-20 5 views
3

Имея следующий HTML-код:Как я могу подсчитать количество атрибутов элемента в Selenium Python?

<span class="warning" id ="warning">WARNING:</span> 

Для объекта доступного по XPATH:

.//*[@id='unlink']/table/tbody/tr[1]/td/span 

Как можно подсчитать свои атрибуты (класс, ID) с помощью Selenium WebDriver + Python 2.7 , не зная их имен?

Я что-то вроде графа = 2.

ответ

2

Получил это! Это должно работать для div, span, img, p и многих других основных элементов.

element = driver.find_element_by_xpath(xpath) #Locate the element. 

outerHTML = element.get_attribute("outerHTML") #Get its HTML 
innerHTML = element.get_attribute("innerHTML") #See where its inner content starts 

if len(innerHTML) > 0: # Let's make this work for input as well 
    innerHTML = innerHTML.strip() # Strip whitespace around inner content 
    toTrim = outerHTML.index(innerHTML) # Get the index of the first part, before the inner content 
    # In case of moste elements, this is what we care about 
    rightString = outerHTML[:toTrim] 
else: 
    # We seem to have something like <input class="bla" name="blabla"> which is good 
    rightString = outerHTML 
# Ie: <span class="something" id="somethingelse"> 

strippedString = rightString.strip() # Remove whitespace, if any 
rightTrimmedString = strippedString.rstrip('<>') # 
leftTrimmedString = rightTrimmedString.lstrip('</>') # Remove the <, >, /, chars. 
rawAttributeArray = leftTrimmedString.split(' ') # Create an array of: 
# [span, id = "something", class="somethingelse"] 

curatedAttributeArray = [] # This is where we put the good values 
iterations = len(rawAttributeArray) 

for x in range(iterations): 
    if "=" in rawAttributeArray[x]: #We want the attribute="..." pairs 
     curatedAttributeArray.append(rawAttributeArray[x]) # and add them to a list 

numberOfAttributes = len(curatedAttributeArray) #Let's see what we got 
print numberOfAttributes # There we go 

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

Спасибо, Р.

P.S. Это может быть дополнительно улучшено, например, удаление дескрипторов вместе с <,> или /.

0

Это не будет легко ожидал.

Каждый элемент имеет ряд неявных атрибутов, а также те, которые явно определены (например, выбранные, отключенные и т. Д.). В результате единственный способ, которым я могу думать, чтобы сделать это было бы получить ссылку на родителя, а затем использовать исполнитель JavaScript, чтобы получить innerHTML:

document.getElementById('{ID of element}').innerHTML 

Вы бы тогда разобрать, что возвращается innerHTML для выделения отдельных элементов, а затем, как только вы выделили элемент, который вам интересен, вам снова придется проанализировать этот элемент, чтобы извлечь список атрибутов.

+0

Если я что-то вроде: 'эль = driver.find_element_by_xpath (XPath) печати elem.get_attribute ("outerHTML") печати elem.get_attribute ("innerHTML")' я получаю: '< span class = "warning"> ПРЕДУПРЕЖДЕНИЕ: 'и ' WARNING: ' Итак, возможно, что какой-то Python REGEX в сочетании с elem.get_attribute (" externalHTML ") может сделать трюк? –

+0

Хорошо, я не думал об использовании externalHTML (что было бы разумно, поскольку оно даст вам тот элемент, который вы сейчас выбрали, DOH). – Ardesco

Смежные вопросы