Консенсус заключается в использовании словаря для этого - см. другие ответы. Это хорошая идея для большинства случаев, однако есть много аспектов, связанных с этим:
Тем не менее, я реализовал variable variables manager -класс, который предоставляет некоторые из вышеперечисленных идей. Он работает для python 2 и 3.
Вы использовали бы класс следующим образом:
from variableVariablesManager import VariableVariablesManager
myVars = VariableVariablesManager()
myVars['test'] = 25
print(myVars['test'])
# define a const variable
myVars.defineConstVariable('myconst', 13)
try:
myVars['myconst'] = 14 # <- this raises an error, since 'myconst' must not be changed
print("not allowed")
except AttributeError as e:
pass
# rename a variable
myVars.renameVariable('myconst', 'myconstOther')
# preserve locality
def testLocalVar():
myVars = VariableVariablesManager()
myVars['test'] = 13
print("inside function myVars['test']:", myVars['test'])
testLocalVar()
print("outside function myVars['test']:", myVars['test'])
# define a global variable
myVars.defineGlobalVariable('globalVar', 12)
def testGlobalVar():
myVars = VariableVariablesManager()
print("inside function myVars['globalVar']:", myVars['globalVar'])
myVars['globalVar'] = 13
print("inside function myVars['globalVar'] (having been changed):", myVars['globalVar'])
testGlobalVar()
print("outside function myVars['globalVar']:", myVars['globalVar'])
Если вы хотите разрешить переписывание переменных с помощью только тот же тип:
myVars = VariableVariablesManager(enforceSameTypeOnOverride = True)
myVars['test'] = 25
myVars['test'] = "Cat" # <- raises Exception (different type on overwriting)
Это должно работать:
.//button[.='OK' and not(ancestor::div[contains(@style,'display:none')])
and not(ancestor::div[contains(@style,'display: none')])]
EDIT:
Более простое и эффективное выражение ниже:
//div[not(contains(@style,'display:none'))]//button[.='OK']
работает неправильно, потому что каждый кнопка имеет по крайней мере один div, который виден у его предков.
//div[contains(@style,'display: block')]
Этот код найдет видимый элемент xpath
inline
, inline-block
, flex
, ...
– Mike Warren
20 June 2018 в 15:21
Selenium 2 Webdriver дает нам возможность метода isDisplayed (), который касается этой проблемы. Хорошая работа соседей.
StaleElementReferenceException
, когда элементы изменяются между извлечением (find by *
) и проверкой его видимости с помощью isDisplayed()
.
– Blaise
1 December 2016 в 09:59
class="display: none;"
не соответствует указанному выше (пространство делает его другим). – ReactiveRaven 25 January 2013 в 19:01display: none;
, что делает элемент невидимым, но все же совпадает с этим выражением XPath. – acdcjunior 15 June 2014 в 18:33