1

各項目をクリックしてスクリーンショットを撮りたいアコーディオン ブロックがあります。各アイテムはクラスを共有しているため、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>

パイソン:

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()

これにより、次のエラーでタイムアウトが発生しています。このエラーを確認しましたが、インターネット オプションやプロキシ設定に問題がありました。プロキシを持っていないので、なぜこれが始まったのかわかりません。

 [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>

物事をシンプルにし、コンテンツが入力されるのを待たずにうまく機能し、私が望むすべてを次のように行います。

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()
4

1 に答える 1

1

暗黙の待機があなたの望むものだとは思いませんし、あなたのコードで何かをしているとは思いません。「暗黙的な待機とは、要素がすぐに利用できない場合に要素を見つけようとするときに、WebDriver に一定時間 DOM をポーリングするように指示することです。デフォルト設定は 0 です。設定すると、暗黙的な待機が生涯にわたって設定されます。 WebDriver オブジェクト インスタンスの。」-ウェブドライバー

本当に必要なのは、アコーディオンのコンテンツが表示されるのを待ってからスクリーンショットを撮る明示的な待機です。

申し訳ありませんが、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

更新:申し訳ありませんが、最初に提案した解決策には 2 つの大きな問題があると思います。(1)タイムアウトエラーが発生した場合ではなく、常に実行されるため、except:代わりに実行する必要があります。(2) Watir-Webdriver とは異なり、Selenium-Webdriver は現在の要素に関するチェックを許可していないようです。最初に提案された解決策は、常にページの最初をチェックすることです (悪い)。別の要素に関して要素を見つけることができる唯一の方法は、xpath (または css-selector) を使用することです。finally:finally:accordionContentaccordionaccordionContent

以下は、これら 2 つの概念で更新されました。

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()
于 2012-04-10T17:14:31.093 に答える