我有一个手风琴块,我想点击每个项目&截取屏幕截图。每个项目共享一个类,所以我认为for循环可以工作,但我不能让它选择项目。
HTML结构:
<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()
这导致超时并出现以下错误。我看过这个错误&amp;人们在互联网选项/代理设置方面遇到了麻烦 - 我没有代理,所以不确定为什么会这样;
[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>
简单易懂不等待内容填充工作正常&amp;以下是我想要的所有内容;
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()
答案 0 :(得分:1)
我不认为隐含的等待是你想要的,我不相信它在你的代码中做了什么。 “隐式等待是告诉WebDriver在尝试查找一个或多个元素(如果它们不是立即可用)时轮询DOM一段时间。默认设置为0.一旦设置,隐式等待就会设置为生命WebDriver对象实例。“ - Webdriver
你真正想要的是explicit wait等待出现的手风琴内容,然后截取屏幕截图。
抱歉,不是Python程序员,所以我猜测确切的代码。但我认为你想要这样的东西:
detailsAccordion = browser.find_elements_by_class_name('accordion')
for option in detailsAccordion:
option.click() # open div
#Wait until the accordionContent div has text
try:
element = WebDriverWait(browser, 10).until(lambda option : option.find_element_by_class_name("accordionContent").text != "" )
finally:
#Throw error cause the div didn't populate
browser.quit
n = nextNumber(n)
browser.save_screenshot('{0}\{1}.png'.format(imagesPath, n))
option.click() #close div
更新:抱歉,我认为我最初建议的解决方案存在两个主要问题。 (1)它应该是except:
而不是finally:
,因为finally:
总是执行而不是仅仅存在超时错误。 (2)与Watir-Webdriver不同,似乎Selenium-Webdriver不允许检查accordionContent
当前accordion
元素。最初提出的解决方案始终检查页面上的第一个accordionContent
(错误)。我可以找到关于另一个元素的元素的唯一方法是使用xpath(或css-selector)。
以下两个概念更新了以下内容:
detailsAccordion = browser.find_elements_by_class_name('accordion')
index = 1
for option in detailsAccordion:
print option
option.click()
try:
element = ui.WebDriverWait(browser, 10).until(lambda driver : driver.find_element_by_xpath("//div[@class='accordion'][" + str(index) + "]/div[@class='accordionContent']").text != "" )
except:
# Error if div didn't populate
print "Can't do it"
browser.quit()
index = index + 1
n = nextNumber(n)
browser.save_screenshot('{0}\{1}.png'.format(imagesPath, n))
option.click()