【问题标题】:Example of touch event with webdriver python?webdriver python的触摸事件示例?
【发布时间】:2013-04-08 17:03:47
【问题描述】:

我在网上看到了大约 100 个touch event examples for the Java webdriver,但没有一个用于 python。 有人会好心地在这里发布一个,这样可以节省人们很多小时的搜索时间吗? 这是我尝试在 android 模拟器中对元素进行基本的 double_tap 以放大它。非常感谢

编辑:感谢 Julian 的帮助,我能够找出丢失的链接:由于某种原因,触摸操作最后需要一个额外的 .perform()。下面你会发现一堆正在运行的触摸事件——而且代码更简洁。尽情享受吧!

import unittest, time
from selenium import webdriver

print "Here are our available touch actions (ignore the ones that look like __xx__): ", dir(webdriver.TouchActions)
#print dir(webdriver)



class Test(unittest.TestCase):


    def setUp(self):
        self.driver = webdriver.Remote(command_executor='http://localhost:8080/wd/hub',  desired_capabilities=webdriver.DesiredCapabilities.ANDROID)
        self.touch =webdriver.TouchActions(self.driver)

        #self.driver = TouchActions(self.driver)
        #self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)


    def testHotmail(self):
        self.driver.get("http://www.hotmail.com")

        elem=self.driver.find_element_by_css_selector("input[name='login']")
        #tap command
        self.touch.tap(elem).perform()
        time.sleep(2)
        elem.send_keys("hello world")
        time.sleep(2)
        #double tap
        self.touch.double_tap(elem).perform()
        time.sleep(2)

        #testing that regular webdriver commands still work
        print self.driver.find_element_by_partial_link_text("Can't access").text

        elem= self.driver.find_element_by_css_selector("input[type='submit']")
        self.touch.tap(elem).perform()
        time.sleep(3)




    def tearDown(self):

        time.sleep(3)

        try:
            self.driver.quit()
        except Exception:
            print(" TearDown Method: Browser seems already closed.")

        pass


if __name__ == "__main__":
    unittest.main()

这是一个原始的 Java 示例:

WebElement toFlick = driver.findElement(By.id("image"));
// 400 pixels left at normal speed
Action flick = getBuilder(driver).flick(toFlick, 0, -400, FlickAction.SPEED_NORMAL)
        .build();
flick.perform();
WebElement secondImage = driver.findElement(“secondImage”);
assertTrue(secondImage.isDisplayed());

【问题讨论】:

    标签: android python selenium webdriver


    【解决方案1】:

    我对您的示例进行了一些调整,至少测试运行没有错误。当用户双击用户名字段时,我不知道您希望网站做什么...

    这是修改后的代码:

    import unittest, time
    
    from selenium.webdriver import Remote
    from selenium.webdriver import  DesiredCapabilities
    from selenium.webdriver.remote import webelement , command
    from selenium.webdriver.common.action_chains import ActionChains
    from selenium.webdriver.common.touch_actions import TouchActions
    
    
    
    
    class Test(unittest.TestCase):
    
    
        def setUp(self):
            remote = Remote(command_executor='http://localhost:8080/wd/hub',  desired_capabilities=DesiredCapabilities.ANDROID)
            self.remote=remote
            remote.implicitly_wait(30)
    
        def tearDown(self):
            pass
    
    
        def testName(self):
            # self.remote.get("http://icd.intraxinc.com/pxr")
            self.remote.get("https://icd.intraxinc.com/pxr/ext/login.action")
            elems= self.remote.find_element_by_css_selector("#j_username")
            print dir(self)
            print dir(self.remote)
            touchactions = TouchActions(self.remote)
            print dir(touchactions)
            touchactions.double_tap(elems)
    
    
    if __name__ == "__main__":
        #import sys;sys.argv = ['', 'Test.testName']
        unittest.main()
    

    我在示例中留下了各种调试打印语句,以向您展示我是如何调查您所面临的问题的。我还将 URL 更改为您的登录页面重定向到的 URL。这是解决我在设备上安装的 Android 驱动程序版本时遇到的一个不相关问题的解决方法。

    仅供参考:我在运行 Android 4.0.4 的 Android 手机上使用 android-server-2.21.0.apk 进行了测试。以下是您的示例代码的重大更改

            touchactions = TouchActions(self.remote)
            print dir(touchactions)
            touchactions.double_tap(elems)
    

    【讨论】:

    • 这很有帮助。有关 Android webdriver 的工作代码,请参阅我的原始问题。哇哦!
    • 附带问题:在 webdriver init 文件中,它已经导入: from common.touch_actions import TouchActions 。为什么我们需要在测试模块中再次导入触摸动作?
    • 感谢这个额外的问题 :) 我从中学到了一些新东西。如果我们改为导入 webdriver,我们不需要导入 TouchActions。它可以作为 webdriver 对象的一部分使用,例如webdriver.TouchActions(...) 但是,由于您的代码分别导入 Remote 和 DesiredCapabilities,因此 TouchActions 似乎不在导入的命名空间中。 from selenium import webdriver 然后尝试 dir(webdriver.TouchActions) 查看方法。仅供参考比较 cat py/selenium/webdriver/remote/__init__.pycat py/selenium/webdriver/__init__.py
    • 如果只使用触摸动作,为什么还要导入动作链?
    • @AkinHwan 关于ActionChains的导入的好问题,我不知道是否需要,我6年前写了这个答案,代码足以帮助提出问题的人这个问题。我没有在这个领域积极工作。随意根据您的测试结果进行试验和更新答案。对于您的另一个问题,我不知道是否有合适的问题 - 如果您找不到合适的问题,那么在 StackOverflow 上提出一个新问题怎么样?
    【解决方案2】:

    您还可以使用 mobile emulation 使触摸动作与 selenium 一起使用:

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    mobile_emulation = { "deviceName": "Nexus 5" }
    
    chrome_options = Options()
    chrome_options.add_experimental_option("mobileEmulation", mobile_emulation)
    
    driver = webdriver.Chrome(chrome_options = chrome_options)
    

    然后以通常的方式使用:

    from selenium.webdriver import TouchActions
    
    driver.get("http://example.com/")
    
    element = context._selenium_browser.find_element_by_link_text("More information...")
    
    touch_actions = TouchActions(driver)
    touch_actions.tap(element).perform()
    
    driver.current_url  # yields: https://www.iana.org/domains/reserved
    

    【讨论】:

      猜你喜欢
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多