参考这个帖子http://testerhome.com/topics/2354 回帖中的 waitForElement,我自己写了一个 appium selendroid 模式下的 python 函数查找 toast
message:消息内容
timeout:超时时间
poll_frequency:查询步长
driver:就是 driver
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
def find_toast(message,timeout,poll_frequency,driver):
element = WebDriverWait(driver,timeout,poll_frequency).until(expected_conditions.presence_of_element_located((By.PARTIAL_LINK_TEXT,message)))
运行结果 Message: A new session could not be created. (Original error: Waited 20 secs for selendroid server and it never showed up),怎么解?
楼主,我用了你的方法,怎么提示下面的错误:
Error
Traceback (most recent call last):
File "D:\python_test\SIP\TestSuit_Backup.py", line 278, in test_c0005_cancel_backup
a = find_toast(u"Password can not be empty", 20, 0.5, self.driver)
File "D:\python_test\SIP\TestSuit_Backup.py", line 24, in find_toast
element = WebDriverWait(driver, timeout, poll_frequency).until(expected_conditions.presence_of_element_located((By.PARTIAL_LINK_TEXT, message)))
File "C:\Python27\lib\site-packages\selenium\webdriver\support\wait.py", line 80, in until
raise TimeoutException(message, screen, stacktrace)
TimeoutException: Message:
急急急啊,在线等回复
#38 楼 @chrisjywu 请问 toast message 是中文的情况下,如何才能定位到这个 toast?我这边,日志说,没有找到 elemnt,请问如何解决
代码是:
def find_toast(message, timeout, poll_frequency, driver):
element = WebDriverWait(driver,timeout,poll_frequency).until(expected_conditions.presence_of_element_located(( By.PARTIAL_LINK_TEXT, message)))
return element
time.sleep(5)
driver.find_element_by_id("login_account").clear()
driver.find_element_by_id("login_account").send_keys("phone_number")
driver.find_element_by_id("login_password_edit").clear()
driver.find_element_by_id("login_password_edit").send_keys("1234567")
driver.find_element_by_id("login_btn_bg_btn").click()
a = find_toast(u"账号或密码错误",5, 1, driver)
日志信息是:
info: [debug] Proxying command to localhost:8080
info: [debug] Making http request with opts: {"url":"http://localhost:8080/wd/hu
b/session/e0229ff2-96e2-de1c-5e18-2f4f03502f36/element","method":"POST","json":{
"using":"partial link text","sessionId":"e0229ff2-96e2-de1c-5e18-2f4f03502f36","
value":"账号或密码错误"}}
info: [debug] Responding to client with error: {"status":7,"value":{"message":"A
n element could not be located on the page using the given search parameters.","
origValue":"Element was not found."},"sessionId":"e0229ff2-96e2-de1c-5e18-2f4f03
502f36"}
樓上請重開貼啦,不要搞亂主題。謝謝
因为想获取 toast 提示信息,尝试 以 Selendroid 模式启动 Appium 但是一直报错提示建立新 session 失败 如下
def setUp(self):
desired_caps={}
desired_caps['device'] = 'android'
desired_caps['platformName']='Android'
desired_caps['automationName']='Selendroid'
desired_caps['browserName']=''
desired_caps['noReset'] = True
desired_caps['platformVersion']='4.3'
desired_caps['deviceName']='SM-G7108V'
desired_caps['app'] = PATH('C:\Program Files (x86)\Appium\golo.apk')
报错信息如下:
Traceback (most recent call last):
File "C:\Users\Win-Attack\Desktop\test_get_toast.py", line 53, in setUp
self.driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
File "C:\Python27\lib\site-packages\appium\webdriver\webdriver.py", line 36, in __init__
super(WebDriver, self).__init__(command_executor, desired_capabilities, browser_profile, proxy, keep_alive)
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 90, in __init__
self.start_session(desired_capabilities, browser_profile)
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 177, in start_session
response = self.execute(Command.NEW_SESSION, capabilities)
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 236, in execute
self.error_handler.check_response(response)
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 194, in check_response
raise exception_class(message, screen, stacktrace)
WebDriverException: Message: A new session could not be created. (Original error: Required platform doesn't exist (API level >= 17))
求解~希望各位大神帮助~ 或者有没有其他方式获取到 toast 进行比对 多谢各位啦
用这个需要切换到 slendroin 吗?如果要,切换后对使用 appium 有什么影响?
@xdlhy
def find_toast(u'密码错误,请重新输入',5,1,self.driver):
element = WebDriverWait(driver,timeout,poll_frequency).until(expected_conditions.presence_of_element_located((By.PARTIAL_LINK_TEXT,message))) 你的这个用不了呢
def find_toast(u'密码错误,请重新输入',5,1,self.driver):
^
SyntaxError: invalid syntax
[Finished in 0.2s with exit code 1]
return 什么呀,不太明白
#30 楼 @chrisjywu 感谢你的提醒,我最近没来网站
#30 楼 @chrisjywu ok,我 memo 下!
#27 楼 @chrisjywu 解决了我的问题,谢谢!
大家好,我的奇葩问题终于解决。
原因是,selendroid 版本 0.15 之后,就不支持(有 bug)find link text 来 check toast
而我之前用的 appium 版本,1.4.16, 底层是用的 selendroid 0.17..
所以我需要把自己的 appium 版本降级到旧版本,比如 1.4.8(底层引用 selendroid 0.15)才可以工作
https://github.com/selendroid/selendroid/issues/978
我一年前也用過這個方法來查 toast 元素,也是用的 selendroid mode。
但是不知道為什麼現在不行了,會不會是新版本不支持了呢?
可否煩請告知你們用的 server+client 版本? 是不是最新的?
我用的是 android selendroid mode。
不知道為什麼用 driver find element by partiial link text 找不到 元素呢!
用了一下,不知道为什么总是提示找不到。
但是我如果设置提示和查找的 toast 内容都是"a",居然可以找到,很诡异。
这个只对 web app 有用吧?原生应用由于没有 webdriver 对象不能用吧?
#14 楼 @nancy2896 只有 selendroid 模式能用,until 几个参数我忘了,我这样写肯定没问题
导入的包也都是 selenium
#12 楼 @nancy2896 method(Driver().get_driver() 这个你在函数里添加的是啥呀,我原先没写这个呀
从报的错看,是没有这种定位方式,你是不是用的不是 selendroid 模式?
desired_caps['automationName']='Selendroid'
要导入的那几个模块都导入了么?
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
我现在定义成这样了
@classmethod
def find_toast(cls, message, timeout, poll_frequency, driver):
element = WebDriverWait(driver, timeout, poll_frequency).until(method(Driver().get_driver()), expected_conditions.presence_of_element_located((By.PARTIAL_LINK_TEXT, message)))
print element
不报那个错了,报了别的错
Error
Traceback (most recent call last):
File "E:\Users\Administrator\PycharmProjects\Shuangshi_AppiumDemo\Test\TestMyWork\TestMyWorkScripts.py", line 208, in test_19_Question_Check
RES.find_toast(u"无语音解析",5, 1, self.driver)
File "E:\Users\Administrator\PycharmProjects\Shuangshi_AppiumDemo\Test\TestMyWork\TestMyWorkScripts.py", line 69, in find_toast
element = WebDriverWait(driver, timeout, poll_frequency).until(expected_conditions.presence_of_element_located((By.PARTIAL_LINK_TEXT,message)))
File "C:\Python27\lib\site-packages\selenium\webdriver\support\wait.py", line 71, in until
value = method(self._driver)
File "C:\Python27\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 59, in __call_
return _find_element(driver, self.locator)
File "C:\Python27\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 278, in _find_element
raise e
WebDriverException: Message: Invalid locator strategy: partial link text
#9 楼 @nancy2896 你把你的 find_toast 函数也贴一下吧
#9 楼 @nancy2896 你用的是 selendroid 模式么?奇了怪了。。。,导入的是 selenium 么?
#6 楼 @nancy2896 find_toast(u"登录成功",5,0.5,self.driver)
我平时就这么用的,没啥问题呀
#6 楼 @nancy2896 这个错误意思应该是,要 4 个参数,你给传了 5 个,你是不是写错了
@xdlhy
楼主 这个参数怎么传啊
我这样传报错啊 Find_Toast.find_toast(message, 2000, 1, driver)
提示错误 TypeError: find_toast() takes exactly 4 arguments (5 given)
#4 楼 @Dwyane 我写这个只能在 appium selendroid 模式下应用,driver 就是 类似 self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) 这个
大神,我现在只是集成 UIAUTOMATOR,在调用 find_toast 时,driver 不知道怎么给值,driver 就是 driver???
不能用
不错的~~