9

Stack Overflow で Selenium タイムアウトの質問をすべて読んだと思いますが、Selenium Webdriver 2.25 (Python 2.7 バインディング) では暗黙的タイムアウトも明示的タイムアウトも機能せず、「no_timeout_here =" の両方の行が永遠にハングします -

browser = webdriver.Firefox()
browser.implicitly_wait(6)               
browser.set_page_load_timeout(30)        
browser.get("http://www.google.com")
try:
    #no_timeout_here = browser.find_element_by_id("id_not_found")
    no_timeout_here = WebDriverWait(browser, 5).until(lambda browser:
            browser.find_element_by_id("id_not_found"))
except:
    raise

すべてのポインタは大歓迎です!

10月16日更新

ただし、包括的な回答を提供してくれたseleniumnewbieに感謝しますが、ユニットテストコードは、Python 2.7のUbuntu 11.04(64ビット)でまだハングしています-

(2012/10/17 11:51:58)$ time ./timeout.py 
^CTraceback (most recent call last):
...
KeyboardInterrupt

real    2m26.572s
user    0m0.368s
sys 0m0.232s

(2012/10/17 11:54:26)$ python -V
Python 2.7.2+

(2012/10/17 11:57:04)$ uname -a
Linux 3.0.0-26-generic #43-Ubuntu SMP Tue Sep 25 17:19:22 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

(2012/10/17 11:57:10)$ ls selenium-server-standalone-2.25.0.jar

OS/Python のバージョンを教えていただけますか?

4

2 に答える 2

8

Firefox 17 と Selenium 2.26.0 を使用している場合、欠陥 #4814 が発生しています: http://code.google.com/p/selenium/issues/detail?id=4814

于 2012-11-29T13:21:46.880 に答える
4

ここで見つかった回答に基づいて

1

ExpectedConditons で WebDriverWait を使用することをお勧めします。

//scroll down with Javascript first
WebDriverWait wait = new WebDriverWait(driver, 30);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("selector")));
//interact with your element
element.click()

Selenium の公式ページ ( http://seleniumhq.org/docs/04_webdriver_advanced.html ) で提供されるガイダンスを ご覧ください。

2

特に流暢な待機を使用してみてください。主な機能は次のとおりです。

タイムアウトとポーリング間隔をその場で構成できる Wait インターフェイスの実装。各 FluentWait インスタンスは、条件を待機する最大時間と、条件をチェックする頻度を定義します。さらに、ユーザーは、ページ上の要素を検索するときの NoSuchElementExceptions など、待機中に特定の種類の例外を無視するように待機を構成できます。

public WebElement fluentWait(final By locator){
        Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
                .withTimeout(30, TimeUnit.SECONDS)
                .pollingEvery(5, TimeUnit.SECONDS)
                .ignoring(NoSuchElementException.class);

        WebElement foo = wait.until(
new Function<WebDriver, WebElement>() {
            public WebElement apply(WebDriver driver) {
                        return driver.findElement(locator);
                }
                }
);
                           return  foo;              }     ;

説明されているメソッドは、操作できる Web 要素を返します。したがって、アプローチは次のとおりです。1)スクロール後にレンダリングされると予想される要素のセレクターを見つける必要があります。

String cssSelector = "blablabla"

2) js で下にスクロール 3)

WebElement neededElement  = fluentWait(cssSelector);
neededElement.click();
//neededElement.getText().trim();

流暢な待機の詳細については、こちらをご覧ください

アップデート


from selenium import webdriver
import unittest, time, re

class Sdsdsd(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.base_url = "https://www.google.com/"
        self.verificationErrors = []

    def test_sdsdsd(self):
        driver = self.driver
        driver.get ("http://www.google.com")
        try:
             driver.find_element_by_id("id_not_found")# I am only searching for the element not assigning it to anything.
        except:
            raise


    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException, e: return False
        return True

    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()

そして、私はこの例外を受け取ります。これは望ましいことです

E
======================================================================
ERROR: test_sdsdsd (__main__.Sdsdsd)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "sdsdsd.py", line 19, in test_sdsdsd
    driver.find_element_by_id("id_not_found")
  File "/Library/Python/2.6/site-packages/selenium-2.2.0-py2.6.egg/selenium/webdriver/remote/webdriver.py", line 172, in find_element_by_id
    return self.find_element(by=By.ID, value=id_)
  File "/Library/Python/2.6/site-packages/selenium-2.2.0-py2.6.egg/selenium/webdriver/remote/webdriver.py", line 525, in find_element
    {'using': by, 'value': value})['value']
  File "/Library/Python/2.6/site-packages/selenium-2.2.0-py2.6.egg/selenium/webdriver/remote/webdriver.py", line 144, in execute
    self.error_handler.check_response(response)
  File "/Library/Python/2.6/site-packages/selenium-2.2.0-py2.6.egg/selenium/webdriver/remote/errorhandler.py", line 110, in check_response
    raise exception_class(message, screen, stacktrace)
NoSuchElementException: Message: u'Unable to locate element: {"method":"id","selector":"id_not_found"}' ; Stacktrace: Method WebDriverError threw an error in file:///private/var/folders/TA/TAS7MYfcEuG3lBNHwhrjRU+++TI/-Tmp-/tmpEf_lrD/extensions/fxdriver@googlecode.com/resource/modules/utils.js 

----------------------------------------------------------------------
Ran 1 test in 33.818s

FAILED (errors=1)

また、33 秒後に失敗したことにも注意してください。つまり、エラーになる前に 30 秒間待機したことになります。

暗黙の待機を変更するとself.driver.implicitly_wait(15)

このエラーが発生します

E
======================================================================
ERROR: test_sdsdsd (__main__.Sdsdsd)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "sdsdsd.py", line 19, in test_sdsdsd
    driver.find_element_by_id("id_not_found")
  File "/Library/Python/2.6/site-packages/selenium-2.2.0-py2.6.egg/selenium/webdriver/remote/webdriver.py", line 172, in find_element_by_id
    return self.find_element(by=By.ID, value=id_)
  File "/Library/Python/2.6/site-packages/selenium-2.2.0-py2.6.egg/selenium/webdriver/remote/webdriver.py", line 525, in find_element
    {'using': by, 'value': value})['value']
  File "/Library/Python/2.6/site-packages/selenium-2.2.0-py2.6.egg/selenium/webdriver/remote/webdriver.py", line 144, in execute
    self.error_handler.check_response(response)
  File "/Library/Python/2.6/site-packages/selenium-2.2.0-py2.6.egg/selenium/webdriver/remote/errorhandler.py", line 110, in check_response
    raise exception_class(message, screen, stacktrace)
NoSuchElementException: Message: u'Unable to locate element: {"method":"id","selector":"id_not_found"}' ; Stacktrace: Method WebDriverError threw an error in file:///private/var/folders/TA/TAS7MYfcEuG3lBNHwhrjRU+++TI/-Tmp-/tmpXSbCY0/extensions/fxdriver@googlecode.com/resource/modules/utils.js 

----------------------------------------------------------------------
Ran 1 test in 18.843s

FAILED (errors=1)
于 2012-10-15T10:16:04.253 に答える