ここで見つかった回答に基づいて
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)