Jer*_*rry 9 python selenium qa selenium-webdriver
我想我已经阅读了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
Run Code Online (Sandbox Code Playgroud)
所有指针将不胜感激!
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
Run Code Online (Sandbox Code Playgroud)
我可以知道您的OS/Python版本吗?
如果您使用的是Firefox 17和Selenium 2.26.0,那么您将遇到缺陷#4814:http://code.google.com/p/selenium/issues/detail? id = 4814
基于此处找到的答案
我建议将 WebDriverWait 与 ExpectedConditons 一起使用。
//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()
Run Code Online (Sandbox Code Playgroud)
看看Selenium官方页面提供的指导: http://seleniumhq.org/docs/04_webdriver_advanced.html
特别尝试使用流畅的等待。主要特点是:
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; } ;
Run Code Online (Sandbox Code Playgroud)
所描述的方法返回您可以操作的网络元素。因此,方法如下:1)您需要找到希望在滚动后呈现的元素的选择器,例如
String cssSelector = "blablabla"
Run Code Online (Sandbox Code Playgroud)
2)用js向下滚动3)
WebElement neededElement = fluentWait(cssSelector);
neededElement.click();
//neededElement.getText().trim();
Run Code Online (Sandbox Code Playgroud)
您可以在这里获取有关流畅等待的更多信息
更新
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()
Run Code Online (Sandbox Code Playgroud)
我得到了这个例外,这是所期望的
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)
Run Code Online (Sandbox Code Playgroud)
另请注意,它在 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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7458 次 |
| 最近记录: |