yashaka

Untitled

Feb 7th, 2017
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.68 KB | None | 0 0
  1. action_chains = ActionChains(get_driver())
  2. action_chains.context_click(self.element()).perform()
  3.  
  4. це мабуть занадто
  5.  
  6. в селен і так має бути context_click
  7.  
  8.  
  9. просто пишеш self.element().context_click()
  10. і все
  11.  
  12. а для того щоб працював автокомпліт і ти сама побачила що там цей контекст клік є..., треба ось таке дописати:
  13.  
  14. def element(self):
  15. # type: () -> SeleneElement
  16. return self.container
  17.  
  18. типу анотацію дописати
  19.  
  20. її можна додати ось так: http://joxi.ru/BA0MKqGtJ10YLr
  21.  
  22. але він у тебе не запрацює все одно... тому що ти нахімічила ось тут:
  23.  
  24. @classmethod
  25. def default(cls, element):
  26. container = ss('.context-menu-item')
  27. #container = ss('.context-menu-list').element_by(visible) - doesn`t work, 'clear' object
  28.  
  29. cls.element = element
  30. return ContextMenu(container, cls.element)
  31.  
  32. чомусь присвоїла класу новий атрибут елемент, навіщо?
  33.  
  34. все що тобі треба було зробити це от це:
  35. @classmethod
  36. def default(cls, element):
  37. return ContextMenu(сontainer=ss('.context-menu-item'), element=element)
  38.  
  39.  
  40. але є ще одна проблема...
  41.  
  42. у тебе є поле element
  43.  
  44. class ContextMenu(object):
  45. def __init__(self, container, element):
  46. self.element = element
  47. self.container = container
  48.  
  49. і у тебе є метод element()
  50.  
  51. def element(self):
  52. # type: () -> SeleneElement
  53. return self.container
  54.  
  55. причому яке повертає просто контейнер :)
  56.  
  57. це звісно ж зло :)
  58.  
  59. метод element() не потрібен
  60.  
  61. у тебе ж вже є self.container
  62.  
  63. а елемент в даному випадку означає не елемент віджета а елемент на якому треба контекст-клікнути щоб віджет з'явився
  64.  
  65.  
  66. хех, халепа
  67.  
  68. так що метод element(self) разом з анотацією типу треба кельнути...
  69.  
  70. і дописати анотацію сюди:
  71.  
  72. def __init__(self, container, element):
  73. # type: (SeleneElement, SeleneElement) -> None
  74. self.element = element
  75. self.container = container
  76.  
  77. і тепер запрацює автокомпліт: http://joxi.ru/krD85aRIEG1Vor
  78.  
  79. ги, але чорт, халепа, контекст кліка таки немає в селен, треба дописати: https://github.com/yashaka/selene/issues/85
  80.  
  81. тому поки таки пиши ось так:
  82.  
  83. def open(self):
  84. action_chains = ActionChains(get_driver())
  85. action_chains.context_click(self.element).perform()
  86. return self
  87.  
  88. зверни увагу що self.element тут а не sele.element() (який був контейнером у тебе по факту)
  89.  
  90.  
  91. ну з цим розібрались...
  92.  
  93. тепер повертаючись до чому поле не радагувалось...
  94.  
  95. проблема живе ось тут:
  96.  
  97.  
  98. class Column(object):
  99. def __init__(self, container):
  100. self.container = container
  101. # 'clear'(first_by('css selector', '#table-container').find_by('css selector', 'thead')).find_all_by(
  102. # ('css selector', '.colHeader'))[0]
  103. #doesn`t work
  104.  
  105. def element(self):
  106. return self.container
  107.  
  108. def menu(self):
  109. return ContextMenu(self.container, element=self.container)
  110.  
  111. в от цій останній стрічкі...
  112.  
  113. element=self.container - це правильно, бо ми якраз контекстклікнути маємо по елементу який є контейнером для колумна
  114.  
  115. але от це:
  116. ContextMenu(self.container
  117.  
  118. не вірно... тут якраз має бути батьківський елемент контекст меню, тобто от цей:http://joxi.ru/ZrJNZxkf9QJ7wr
  119.  
  120. тобто правильний код такий:
  121.  
  122. def menu(self):
  123. return ContextMenu(ss('.context-menu-list').element_by(be.visible) , element=self.container)
  124.  
  125.  
  126. але о боже...
  127. що це?
  128.  
  129. def select(self, item):
  130. self.container.element_by(text(item)).click()
  131.  
  132. як це таке може бути що контейнер це список?
  133. контйнер це елемент!
  134.  
  135. :(
  136.  
  137. в елемента немає метода element_by
  138. тому можна тільки так:
  139.  
  140. def select(self, item):
  141. self.container.element(by.text(item)).click()
  142.  
  143. де text - це вже не кондішен...
  144.  
  145. щоб не плутати... юзай селектори-заготовки ті що в by
  146. а кондішени не напряму а через модулі be, have
  147. типу be.visible
  148. have.text
  149. але
  150. by.text
  151. by.xpath
  152. і так далі...
  153.  
  154.  
  155.  
  156. а тепер ось ще одна помилка:
  157.  
  158.  
  159. class Category(object):
  160. def __init__(self, name):
  161. self.name = name
  162.  
  163. def element(self):
  164. return ss('.category-item').find_by(text(self.name))
  165.  
  166. def menu(self):
  167. return ContextMenu.default(self.element)
  168.  
  169. element - це метод а не поле, тому треба так писати:
  170.  
  171.  
  172. def menu(self):
  173. return ContextMenu.default(self.element())
  174.  
  175. і тепер уже все має працювати...
  176.  
  177. ох... не хило я так собі мозок тільки що взламав :)
Advertisement
Add Comment
Please, Sign In to add comment