2013-10-09 3 views
2

Попытка получить все (5) таблицы из этого URL-адреса.splinter select (value) возвращает Ошибка атрибута

http://www.molpower.com//VLCWeb/UIAboutMOL/PortScheduleInfo.aspx?pPort=NLRTMDE&pFromDate=01-Oct-2013&pToDate=10-Oct-2013

Перепад ящик для отдельных страниц, которые я могу заполнить с type(value), но это не обновите страницу. Переход по страницам с помощью кнопки nextPage завершается с ошибкой после одного, потому что объект больше не привязан к DOM (и я не знаю, как обойти это в splinter).

Попытка заполнить выпадающее меню и затем выбрать его. Это возвращает эту ошибку:

Traceback (самый последний вызов в прошлом):

File "<stdin>", line 69, in <module> 
File "/usr/local/lib/python2.6/dist-packages/splinter/driver/webdriver/__init__.py", line 334, in select 
self.find_by_xpath('//select[@name="%s"]/option[@value="%s"]' % (self["name"], value))._element.click() 
File "/usr/local/lib/python2.6/dist-packages/splinter/element_list.py", line 73, in __getattr__ 
    self.__class__.__name__, name)) 
AttributeError: 'ElementList' object has no attribute '_element' 

я использовал код ниже. Любая помощь наиболее ценится!

from splinter import Browser 
from lxml.html import parse 
from StringIO import StringIO 
from time import sleep 

url = r'http://www.molpower.com//VLCWeb/UIAboutMOL/PortScheduleInfo.aspx?pPort=NLRTMDE&pFromDate=01-Oct-2013&pToDate=10-Oct-2013' 

def _unpack(row, kind = 'td'): 
    elts = row.findall('.//%s' %kind) 
    return [val.text_content() for val in elts[0:7]] 

def parse_schdls_data(table): 
    rows = table.findall('.//tr') 
    hdrs = _unpack(rows[0], kind = 'th') 
    data = [_unpack(r, kind = 'td') for ir, r in enumerate(rows[1:-1]) if ir % 3 == 0] 
    return (hdrs, data) 

with Browser() as browser: 
    browser.visit(url) 
    print browser.url 

    pages = browser.find_by_tag('option') 

    pagevals = [p.value for p in pages] 
    maxpagev = max(pagevals) 

    inputs = browser.find_by_tag('input') 

    ''' 
    for ip, inp in enumerate(inputs): 
     if inp.has_class('btnMRBPageNext'): 
      #print ip, inp.value, inp.text 
      #Need input 35 for the nextPage 
      inp.click() 
    ''' 

    selects = browser.find_by_tag('select') 

    for ns, sel in enumerate(selects): 
     if sel.has_class('inputDropDown'): 
      print ns, sel.value, sel.text 
      sel.type(sel.value) 
      sleep(2) 

    moldata = list() 
    for page in range(len(pagevals)): 

     content = browser.html 
     parsed = parse(StringIO(content)) 
     doc = parsed.getroot() 
     tables = doc.findall('.//table') 
     schdls = tables[91] 

     #Get all rows from that table 
     rows = schdls.findall('.//tr') 
     hdr, data = parse_schdls_data(schdls) 
     #print page, data 
     moldata.append(data) 

     while browser.is_element_not_present_by_tag('select', wait_time = 2): 
      pass 

     inputs = browser.find_by_tag('input') 
     selects = browser.find_by_tag('select') 

     #inputs[35].click() 

     #selects[0].type(str(page + 1)) 
     selects[0].select(selects[0].value) 

ответ

1

Поскольку выберите элемент не имеет имени, так, например:

browser.find_by_xpath('//select[@id="MRBgvPortScheduleInformation_edlPager"]/option[@value="2"]')._element.click() 
0

Хотя вы получили ссылку на отдельных элементов, вызвав

selects = browser.find_by_tag('select') 

и затем вызвать метод выбора по этим элементам

selects[0].select(selects[0].value) 

Но из TRACEBACK мы можем знать, осколок преобразует его в find_by_xpath

self.find_by_xpath('//select[@name="%s"]/option[@value="%s"]' % (self["name"], value))._element.click() 

Где предполагает select элемент имеет имя, если нет названия для выбора, будет ошибка.

<html> 
<head> 
</head> 
<body> 
<select id='s1'> 
<option value='a'> A </option> 
<option value='b'> B </option> 
<option value='c'> C </option> 
</select> 

<select id='s2'> 
<option value='a'> A </option> 
<option value='b'> B </option> 
<option value='c'> C </option> 
</select> 

</body> 
</html> 

Мы можем воспроизвести эту ошибку с предыдущей HTML страницы, и после того, как мы добавляем имена 2 select элементов, ошибки исчезли.