Thursday, April 12, 2012

Iterate through each item in accordion block with Selenium & Python

I've got an accordion block which I'd like to click each item & take a screenshot. Each item shares a class so I thought a for loop would work but I can't get it to select the items.



HTML Structure:



<div class="accordionContainer">
<div class="accordion">
<h3>Click This</h3>
<div class="accordionContent" style="display:none">
</div>
<div>
<div class="accordion">
<h3>Click This</h3>
<div class="accordionContent" style="display:none">
</div>
<div>
</div>


Python:



detailsAccordion = browser.find_elements_by_class_name('accordion')
index = 1
for option in detailsAccordion:
option.click()
try:
element = ui.WebDriverWait(ff, 10).until(lambda driver : driver.find_element_by_xpath("//div[@class='accordion'][" + str(index) + "]/div[@class='accordionContent']").text != "" )
except:
print "Can't do it"
browser.quit()
index = index + 1
n = nextNumber(n)
browser.save_screenshot('{0}\{1}.png'.format(imagesPath, n))
option.click()


This is causing a timeout with the following error. I've looked at this error & people have had trouble with internet options/proxy settings - I don't have a proxy so no sure why this has started;



 [exec] Can't do it
[exec] Traceback (most recent call last):
[exec] File "viewEmployeeUseCase.py", line 82, in <module>
[exec] ff.save_screenshot('{0}\{1}.png'.format(imagesPath, n))
[exec] File "C:\Python26\lib\site-packages\selenium-2.20.0-py2.6.egg\selenium\webdriver\firefox\webdriver.py", line 75, in save_screenshot
[exec] png = RemoteWebDriver.execute(self, Command.SCREENSHOT)['value']

[exec] File "C:\Python26\lib\site-packages\selenium-2.20.0-py2.6.egg\selenium\webdriver\remote\webdriver.py", line 151, in execute
[exec] response = self.command_executor.execute(driver_command, params)

[exec] File "C:\Python26\lib\site-packages\selenium-2.20.0-py2.6.egg\selenium\webdriver\remote\remote_connection.py", line 280, in execute
[exec] return self._request(url, method=command_info[0], data=data)
[exec] File "C:\Python26\lib\site-packages\selenium-2.20.0-py2.6.egg\selenium\webdriver\remote\remote_connection.py", line 321, in _request
[exec] response = opener.open(request)
[exec] File "C:\Python26\lib\urllib2.py", line 391, in open
[exec] response = self._open(req, data)
[exec] File "C:\Python26\lib\urllib2.py", line 409, in _open
[exec] '_open', req)
[exec] File "C:\Python26\lib\urllib2.py", line 369, in _call_chain
[exec] result = func(*args)
[exec] File "C:\Python26\lib\urllib2.py", line 1170, in http_open
[exec] return self.do_open(httplib.HTTPConnection, req)
[exec] File "C:\Python26\lib\urllib2.py", line 1145, in do_open
[exec] raise URLError(err)
[exec] urllib2.URLError: <urlopen error [Errno 10061] No connection could be made because the target machine actively refused it>


Making things simple & not waiting for content to populate works fine & does all I want it to with the following;



for option in detailsAccordion:
#print option
option.click()
WebDriverWait(ff, 2)
n = nextNumber(n)
ff.save_screenshot('{0}\{1}.png'.format(imagesPath, n))
option.click()




No comments:

Post a Comment