我正在尝试使用Webdriver点击按钮。在先前字段中输入值之前,该按钮不可见。我试过添加睡眠和明确的等待,但仍然没有运气。
我在想它可能与页面javascript有关,但我的技能并没有那么大。我仍然在为我丑陋的代码学习如此天主教徒......
count=1
while count < 3:
time.sleep(2)
# Not the best way to select the button - but it works for now!
elem = driver.find_element_by_tag_name("button").click()
#Clear default amount
elem = driver.find_element_by_name("amount")
elem.send_keys(Keys.BACKSPACE)
elem.send_keys(Keys.BACKSPACE)
elem.send_keys(Keys.BACKSPACE)
elem.send_keys(Keys.BACKSPACE)
elem.send_keys(Keys.BACKSPACE)
elem.send_keys(Keys.BACKSPACE)
elem.send_keys("0.04")
print 'Entered Amount'
time.sleep(1)
elem.send_keys(Keys.TAB)
time.sleep(3)
elem.send_keys(Keys.TAB)
time.sleep(3)
elem.send_keys("\n")
# This finds the button - but it isn't visible
# elem = driver.find_element_by_tag_name("button").click()
time.sleep(6)
print 'Number of Payments = ', count
count = count + 1
print 'Finished!'
网站代码如下:
<button type="button" class="btn alpha centred-form-button ng-binding" ng-click="accountsPayCtrl.submit()" ng-disabled="!accountsPayCtrl.paymentSubmitted &&
(!paymentForm.$valid || !accountsPayCtrl.inAmount || !accountsPayCtrl.payToken)" tabindex="0" aria-disabled="false">
Pay $0.04 now
</button>
毫无疑问,更优雅的方式也可以达到最终结果!
我得到的错误是:
Traceback (most recent call last):
File "C:\MW_Test\energyaust_Explicit_Wait.py", line 43, in <module>
elem = driver.find_element_by_tag_name("button").click()
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.py", line 75, in click
self._execute(Command.CLICK_ELEMENT)
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.py", line 454, in _execute
return self._parent.execute(command, params)
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 201, in execute
self.error_handler.check_response(response)
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 181, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotVisibleException: Message: Element is not currently visible and so may not be inter
acted with
Stacktrace:
at fxdriver.preconditions.visible (file:///c:/users/ozmatt/appdata/local/temp/tmpupncqr/extensions/fxdriver@googleco
de.com/components/command-processor.js:9981)
at DelayedCommand.prototype.checkPreconditions_ (file:///c:/users/ozmatt/appdata/local/temp/tmpupncqr/extensions/fxd
river@googlecode.com/components/command-processor.js:12517)
at DelayedCommand.prototype.executeInternal_/h (file:///c:/users/ozmatt/appdata/local/temp/tmpupncqr/extensions/fxdr
iver@googlecode.com/components/command-processor.js:12534)
at DelayedCommand.prototype.executeInternal_ (file:///c:/users/ozmatt/appdata/local/temp/tmpupncqr/extensions/fxdriv
er@googlecode.com/components/command-processor.js:12539)
at DelayedCommand.prototype.execute/< (file:///c:/users/ozmatt/appdata/local/temp/tmpupncqr/extensions/fxdriver@goog
lecode.com/components/command-processor.js:12481)
答案 0 :(得分:1)
你不应该在(几乎)任何情况下使用sleep
。
相反,Selenium API为您提供等待,隐式和显式。
来自Selenium文档:
隐式等待隐式等待是告诉WebDriver轮询DOM 试图找到一个元素或一段时间的一段时间 元素,如果它们不是立即可用的。默认设置为 0.设置后,将为WebDriver对象实例的生命周期设置隐式等待。
对于显式等待:
显式等待显式等待是您定义等待的代码 在进一步执行代码之前要发生的某些条件。该 最糟糕的情况是Thread.sleep(),它将条件设置为 确切的等待时间。提供了一些便利方法 这有助于您编写仅在需要时等待的代码。 WebDriverWait与ExpectedCondition相结合就是其中的一种方式 可以完成。
现在,在您的情况下,您需要的是让元素可见,或者因为您需要点击它,让它可以点击:
element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "myDynamicElement")))
Refer to this用于显式等待的用法。
答案 1 :(得分:0)
感谢你们的建议。我有一位同事帮我解决了我的问题,并认为我会在这里添加它,或许可以帮助像我这样的新手。
事实证明,由于没有找到细节来找到按钮,我实际上找到了另一个隐藏按钮。我觉得很傻,但这是一个很好的教训!