Использование xpath / regex или любого другого, чтобы найти видимый текст на веб-странице с помощью искателя [дубликат]

Консенсус заключается в использовании словаря для этого - см. другие ответы. Это хорошая идея для большинства случаев, однако есть много аспектов, связанных с этим:

  • вы сами будете нести ответственность за этот словарь, включая сбор мусора (из переменных in-dict) и т. Д. .
  • нет никакой локальности или глобальности для переменных переменных, это зависит от глобальности словаря
  • , если вы хотите переименовать имя переменной, вам придется сделать это вручную
  • однако вы гораздо более гибкие, например вы можете решить перезаписать существующие переменные или ... ... выбрать реализацию константных переменных для создания исключения при перезаписи для разных типов и т. д.

Тем не менее, я реализовал 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)

39
задан Dave Webb 16 March 2009 в 20:19
поделиться

3 ответа

Это должно работать:

.//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, который виден у его предков.

50
ответ дан djangofan 22 August 2018 в 20:48
поделиться
  • 1
    Вот и все. Большое спасибо. – Dave Webb 16 March 2009 в 21:01
  • 2
    Последний не работает, если есть еще один div в dom-tree, который не скрыт: & lt; div style = 'display: none' & gt; & lt; div & gt; & lt; button id = 'OK' / & gt; & lt; / lt; / DIV & GT; & Lt; / дел & GT; – Fortega 21 May 2012 в 13:32
  • 3
    Примечание class="display: none;" не соответствует указанному выше (пространство делает его другим). – ReactiveRaven 25 January 2013 в 19:01
  • 4
    Обратите внимание на будущих читателей: хотя это отличное решение (и, возможно, лучший XPath), он не применим ко всем случаям , так как данный элемент может иметь класс CSS, в котором display: none;, что делает элемент невидимым, но все же совпадает с этим выражением XPath. – acdcjunior 15 June 2014 в 18:33
  • 5
    Вместо того, чтобы иметь это и для пространства, было бы предпочтительнее удалить пространство из атрибута перед его проверкой. translate (normalize-space (@style), '', '') будет работать с любым количеством пробелов. – carlin.scott 28 August 2014 в 01:55
//div[contains(@style,'display: block')]

Этот код найдет видимый элемент xpath

-4
ответ дан Cody Gray 22 August 2018 в 20:48
поделиться
  • 1
    Вы знаете, что есть другие типы отображаемых значений, верно? Как inline, inline-block, flex, ... – Mike Warren 20 June 2018 в 15:21

Selenium 2 Webdriver дает нам возможность метода isDisplayed (), который касается этой проблемы. Хорошая работа соседей.

12
ответ дан Undo 22 August 2018 в 20:48
поделиться
  • 1
    Это работает, если скрытый атрибут отображения находится на родительском элементе, а не на самом элементе? – Dave Lawrence 4 January 2016 в 16:17
  • 2
    Да, но вы должны проверить это для конкретного элемента, не можете сопоставить целую коллекцию. – sitnarf 6 July 2016 в 16:21
  • 3
    Будьте осторожны, потому что это может вызвать исключения StaleElementReferenceException, когда элементы изменяются между извлечением (find by *) и проверкой его видимости с помощью isDisplayed(). – Blaise 1 December 2016 в 09:59
Другие вопросы по тегам:

Похожие вопросы: