如何等到元素更改后键入

时间:2018-03-20 10:09:02

标签: python selenium webdriver

我想获得一个元素的值,它根据某些条件改变它的类型。

因此,为了检查该元素的类型,我使用以下代码: -

wait(driver, 15).until(EC.presence_of_element_located((By.ID, "incident.state")))


if( element_type != "text" ):
        select = Select(driver.find_element_by_id('incident.state')) 
        selectval=select.first_selected_option.text

    else:
        select=driver.find_element_by_id('incident.state')
        selectval=select.get_attribute('value')

这里的问题是,我总是将元素作为选择而不是文本,有时元素是文本。

所以,我用了

time.sleep(5)

它正在工作。但我不想使用time.sleep,因为这不是一个好习惯。

所以,我尝试了

driver.implicitly_wait(10) 

但它并没有等待 你能告诉我应该用什么......

2 个答案:

答案 0 :(得分:0)

如果您的类型检查通常与sleep一起使用,您可以将类型检查放在一个循环中,例如,将睡眠时间减少到time.sleep(1),然后等待所需的类型。

这样,你就不会浪费太多时间。

如果您想不惜任何代价避免使用sleep,则必须使用其他定位策略。您可以按类型找到ID,而不是ID,然后缩小到ID。请参阅以下函数:

find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector

答案 1 :(得分:0)

对于此ID可以出现的每种不同类型的元素,可能更容易使用更具体的选择器。这里的推理是你应该事先知道元素在测试中的任何一点处的状态。

E.g。找到具有事件状态id的特定html元素的各个方法。 get_incident_state_text_value和get_incident_state_select_value方法将包含这些定位器:

find_element_by_xpath("//text[@id='incident-state']")

find_element_by_xpath("//select[@id='incident-state']")

这样,当您要求它等待其中一个更具体的元素出现时,它将始终等待在测试继续之前出现正确的元素。

如果您无法预测在任何给定时间需要使用哪种方法,您可能会错误地编写测试并依赖于未知状态。一旦您开始尝试让测试在一种方法中处理5种不同的页面状态,它就会很快失控并变得难以维护。