目的:
滑动定位到手机页面上的某个元素
注意项:
1. find_element()方法在ios和android上是有区别的:
在ios上,需要滑动才可见的元素是可以通过find_element()找到的,无需滑页。
而在android上,find_element()无法找到当前页面不可见的元素,必须滑页。
2. 要判断元素究竟是否存在, 对于ios可直接判断;但对于android,只能边滑边判断。 这样就还得判断是否滑到底了仍没有找到目标元素。
我在项目中的实现方式:
def scroll_to_element(self, locator):
"""scroll down to the element located by locator
:param locator: (strategy, locator_str) tuple used to find the element
:return: True - if element is found
False - if element is not found
"""
if self.mobile_type == "IOS":
return self.__scroll_to_element_ios(locator)
elif self.mobile_type == "ANDROID":
return self.__scroll_to_element_android(locator)
__scroll_to_element_ios里使用的基本方法:
driver.execute_script('mobile: scroll', {'direction': 'down'})
__scroll_to_element_android里使用的基本方法:
def __scroll_down(self):
screen_size = self.driver.get_window_size()
screen_width = screen_size['width']
screen_height = screen_size['height']
start_x = end_x = int(screen_width / 2)
start_y = int(screen_height * 0.8)
end_y = int(screen_height * 0.3)
self.__drag(start_x, start_y, end_x, end_y) # 从屏幕高度的80%处滑到30%处
def __drag(self, start_x, start_y, end_x, end_y):
"""drag screen from (start_x, start_y) to (end_x, end_y)"""
actions = ActionChains(self.driver)
actions.w3c_actions.pointer_action.move_to_location(start_x, start_y)
actions.w3c_actions.pointer_action.pointer_down()
actions.w3c_actions.pointer_action.pause(1)
actions.w3c_actions.pointer_action.move_to_location(end_x, end_y)
actions.w3c_actions.pointer_action.release()
actions.perform()
android判断是否滑倒底了
while before_scroll != after_scroll:
before_scroll = self.driver.page_source
self._drag(start_x, start_y, end_x, end_y)
after_scroll = self.driver.page_source
if self.is_displayed(locator):
return True
else:
continue
else:
self.logger.exception(f'Already scrolled to the page bottom, element <{locator}> is not found.')
return False
这个方法有个弊端: 如果元素确实不存在, 滑到底后要再滑一次才能知道两次滑动页面没变