Soru Selenium webdriver: Bir elemanın TÜMÜ özelliklerini nasıl bulabilirim?


Python Selenium modülünde, bir WebElement nesnesine sahip olduğumda, özelliklerinden herhangi birinin değerini alabilirim. get_attribute():

foo = elem.get_attribute('href')

'Href' adlı özellik mevcut değilse, Hiçbiri iade edilir.

Sorum şu; bir öğenin sahip olduğu tüm özelliklerin listesini nasıl alabilirim? Orada görünmüyor get_attributes() veya get_attribute_names() yöntemleri.


25
2017-12-05 01:05


Menşei




Cevaplar:


Bu mümkün değil bir selenyum webdriver API'sı kullanarak javascript kodu yürütme tüm özellikleri almak için:

driver.execute_script('var items = {}; for (index = 0; index < arguments[0].attributes.length; ++index) { items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value }; return items;', element)

Demo:

>>> from selenium import webdriver
>>> from pprint import pprint
>>> driver = webdriver.Firefox()
>>> driver.get('https://stackoverflow.com')
>>> 
>>> element = driver.find_element_by_xpath('//div[@class="network-items"]/a')
>>> attrs = driver.execute_script('var items = {}; for (index = 0; index < arguments[0].attributes.length; ++index) { items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value }; return items;', element)
>>> pprint(attrs)
{u'class': u'topbar-icon icon-site-switcher yes-hover js-site-switcher-button js-gps-track',
 u'data-gps-track': u'site_switcher.show',
 u'href': u'//stackexchange.com',
 u'title': u'A list of all 132 Stack Exchange sites'}

Bütünlük uğruna, etikete ulaşmak için alternatif bir çözüm olurdu. outerHTML ve bir HTML ayrıştırıcısı kullanarak öznitelikleri ayrıştırın. Örnek (kullanarak BeautifulSoup):

>>> from bs4 import BeautifulSoup
>>> html = element.get_attribute('outerHTML')
>>> attrs = BeautifulSoup(html, 'html.parser').a.attrs
>>> pprint(attrs)
{u'class': [u'topbar-icon',
            u'icon-site-switcher',
            u'yes-hover',
            u'js-site-switcher-button',
            u'js-gps-track'],
 u'data-gps-track': u'site_switcher.show',
 u'href': u'//stackexchange.com',
 u'title': u'A list of all 132 Stack Exchange sites'}

39
2017-12-05 01:16



Bunun neden W3C özelliklerine dahil edilmediğine dair bir fikrin var mı? Bunu bırakmak için kısa görüşlü görünüyor w3.org/TR/webdriver/#get-element-attribute - raven
@raven emin değilim, sadece yaygın olarak kullanılmıyor olabilir. Çok daha sık bir kullanıcı tek bir öznitelik almak isterdi .. iyi bir soru olsa da, teşekkürler. - alecxe
Alternatif: lxml element.attrib, tüm özniteliklere sahip güzel ve kullanışlı bir sözlük döndürür. - Sandeep
Etiket outerHTML geçmek için çok yararlı oldu BeautifulSoup :) - J0ANMM
İstediğiniz veya herhangi bir komut yazabilir misiniz execute_script bir şekilde sınırlı mı? - Anthony


Aşağıdakiler en azından PhantomJS veya Chrome sürücüsünü kullanarak benim için tüm özniteliklerin ve onların (bazen dizgeye çevrilmiş) değerlerinin bir listesini alır:

elem.get_property('attributes')[0]

Sadece isimleri almak için:

x.get_property('attributes')[0].keys()

11
2018-06-21 01:44





İşte cevap verme girişimim. Sadece google ana sayfasının arama kutusunda test ettim. @ Alecxe'nin 'outerHTML' hakkındaki yanıtını kullandım. Html'yi aldım, düzenli bir ifade kullandım ([a-z]+-?[a-z]+_?)='?"? özellik isimlerini eşleştirmek için Regex'in giderek artan sayıda dava ile eşleşmesi gerekeceğini düşünüyorum. Ama ihtiyacımız olan asıl ad "eşit işaretin arkasında ne varsa".

Bir webElement verilen

def get_web_element_attribute_names(web_element):
    """Get all attribute names of a web element"""
    # get element html
    html = web_element.get_attribute("outerHTML")
    # find all with regex
    pattern = """([a-z]+-?[a-z]+_?)='?"?"""
    return re.findall(pattern, html)

Aşağıdaki kodda test edin

import re
from selenium import webdriver

driver = webdriver.Firefox()
google = driver.get("http://www.google.com")

driver.find_element_by_link_text("English").click()
search_element = driver.find_element_by_name("q")
get_web_element_attribute_names(search_element)

çıktı:

['class', 'id', 'maxlength', 'name', 'autocomplete', 'title', 'value', 'aria-label', 'aria-haspopup', 'role', 'aria-autocomplete', 'style', 'dir', 'spellcheck', 'type']

2
2017-07-17 08:20