如何等待 Selenium 中的非空输入字段 Python

How to wait for non empty input field in Selenium Python

我正在尝试使用 Python 中的 Selenium 自动 运行 https://www.mastercard.us/en-us/consumers/get-support/convert-currency.html 中的货币转换器。这是我到目前为止得到的:

from selenium import webdriver                                                                                                                                        
from selenium.webdriver.common.by import By                                                                                                                               
from selenium.webdriver.support.ui import Select                                                                                                                      
from selenium.webdriver.support.ui import WebDriverWait                                                                                                               
from selenium.webdriver.support import expected_conditions as EC 

link1 = 'https://www.mastercard.us/en-us/consumers/get-support/convert-currency.html'

driver1 = webdriver.PhantomJS()
driver1.get(link1)

script = """ var select = arguments[0];
             for(var i = 0; i < select.options.length; i++) {
               if(select.options[i].value == arguments[1]) {
                 select.options[i].selected = true;
               }
             }
         """

driver1.find_element_by_id('getDate').send_keys('05-Sep-2017')                                                                                                        

select = driver1.find_element_by_id('firstID')                                                                                                                        
driver1.execute_script(script, select, 'USD');                                                                                                                                                                                                                                                                                              

driver1.find_element_by_name('txtTAmt').send_keys('1.00')                                                                                                             
driver1.find_element_by_name('txtBankFee').send_keys('0.00')                                                                                                                                                                                                                                                                                

select = driver1.find_element_by_id('newID')                                                                                                                          
driver1.execute_script(script, select, 'EUR');                                                                                                                                                                                                                                                                                              

driver1.find_element_by_id('btnSubmit').click()                                                                                                                                                                                                                                                                                             

wait = WebDriverWait(driver1, 100)                                                                                                                                    
element = wait.until(EC.presence_of_element_located((By.XPATH,                                                                                                                                  
                     '//*[@name="txtCardAmt" and text() != ""]')))                                                                                          
print(element.text)  

问题是字段 "txtCardAmt" 从未被填充,我遇到了超时异常。我的问题是,如何等待服务器完成计算?

PS:我知道使用 Select class 有更简单的方法 select 选项,但是由于某些原因,在本网站中它们不起作用。

您的问题是您一直等到名称为 txtCardAmt 的元素的 text 不为空。问题是这总是正确的。

有兴趣的可以看看html:

<input type="text" name="txtCardAmt" ng-model="mcz.txtCardAmt" 
class="mczreadonly ng-pristine ng-valid mczblue" placeholder="0"
readonly="readonly" disabled="">

可以看到没有文字

您要查找的信息(在 html 中不可见)在属性 value:

在我的示例中是 7.38

所以:

elem = driver1.find_element_by_name('txtCardAmt')
value = elem.get_attribute("value")
print(value)

您关于选择日期和货币的代码不起作用。在我的例子中,我使用了 xpath 来做到这一点。我相信有更好的方法来完成这项任务。我用的是我浏览器检查器工具返回的xpath。

整个例子:

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

link1 = 'https://www.mastercard.us/en-us/consumers/get-support/convert-currency.html'
driver1 = webdriver.PhantomJS(executable_path=r'/pathTo/phantomjs')
driver1.get(link1)

driver1.find_element_by_id('getDate').click()
wait = WebDriverWait(driver1, 20)
wait.until(EC.presence_of_element_located((By.XPATH,"/html/body/div[1]/div/div/div/div[2]/div[3]/div/div/div[2]/div/div/div/a[1]/span")))
driver1.find_element_by_xpath("/html/body/div[1]/div/div/div/div[2]/div[3]/div/div/div[2]/div/div/div/a[1]/span").click()
driver1.find_element_by_xpath("//*[@id='transactiondatepicker']/div/table/tbody/tr[2]/td[3]/a").click()


#select = driver1.find_element_by_id('firstID')
#driver1.execute_script(script, select, 'USD');
driver1.find_element_by_xpath("//*[@id='mczRowC']/div[2]/button").click()

wait.until(EC.presence_of_element_located((By.XPATH,"//*[@id='mczRowC']/div[2]/div/ul/li[146]/a")))
driver1.find_element_by_xpath("//*[@id='mczRowC']/div[2]/div/ul/li[146]/a").click()


driver1.find_element_by_name('txtTAmt').send_keys('1.00')
driver1.find_element_by_name('txtBankFee').send_keys('2.00')

#select = driver1.find_element_by_id('newID')
#driver1.execute_script(script, select, 'EUR');
driver1.find_element_by_xpath("//*[@id='mczRowD']/div[2]/button").click()
wait.until(EC.presence_of_element_located((By.XPATH,"//*[@id='mczRowD']/div[2]/div/ul/li[49]/a")))
driver1.find_element_by_xpath("//*[@id='mczRowD']/div[2]/div/ul/li[49]/a").click()


driver1.find_element_by_id('btnSubmit').click()

time.sleep(3)
elem = driver1.find_element_by_name('txtCardAmt')
value = elem.get_attribute("value")
print(value)