我想获得一个元素的值,它根据某些条件改变它的类型。
因此,为了检查该元素的类型,我使用以下代码: -
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)
但它并没有等待 你能告诉我应该用什么......
答案 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种不同的页面状态,它就会很快失控并变得难以维护。