我正在自动执行一个流程,该流程包括从产品列表(即Xamarin ListView的产品列表)中点击产品名称,进入产品详细信息页面。
我已经在ListView中设置了
AutomationProperties.IsInAccessibleTree="false"
在产品名称标签中:
AutomationId="ProductName"
有趣的是,当使用Appium Desktop UI检查工具时,我可以看到XPATH,如果我记录了对其的轻敲,那么它实际上可以工作,并且我得到了以下脚本:
MobileElement el1 = (MobileElement) driver.findElementByXPath("(//XCUIElementTypeStaticText[@name=\"ProductName\"])[1]");
el1.click();
为此,我知道XPATH存在并且对Appium可见。它可以在检查工具中使用。
现在,当我将其转换为Python时,出现了问题:
el1 = self.driver.find_element_by_xpath("(//XCUIElementTypeStaticText[@name=\"ProductName\"])[1]")
我收到此错误消息:
el = self.driver.find_element_by_xpath(element_query) 在find_element_by_xpath中的第393行中的文件“ /usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py” 返回self.find_element(by = By.XPATH,value = xpath) 在find_element中,文件“ /usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py”,行966 'value':value})['value'] 执行中的文件“ /usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py”,第320行 self.error_handler.check_response(响应) 文件“ /Users/joseclua/Library/Python/3.7/lib/python/site-packages/appium/webdriver/errorhandler.py”,第29行,在check_response中 提高WDE 文件“ /Users/joseclua/Library/Python/3.7/lib/python/site-packages/appium/webdriver/errorhandler.py”,第24行,在check_response中 超级(MobileErrorHandler,self).check_response(响应) 文件“ /usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py”,第242行,在check_response中 引发exception_class(消息,屏幕,堆栈跟踪) selenium.common.exceptions.NoSuchElementException:消息:使用给定的搜索参数无法在页面上找到元素。
答案 0 :(得分:1)
由于Suban的洞察力,我能够点击list元素,并且避免使用不推荐使用的XPath。
这是我现在在iOS上使用的代码。我仍然需要在Android中进行测试。
def list_item_tap(self, el_name):
print("list_item_tap {0}", el_name)
li = self.driver.find_elements_by_accessibility_id(el_name)
print("list items: {0}", len(li))
if len(li) > 0:
el = li[0]
time.sleep(2)
el.click()
如果没有睡眠,单击似乎失败。
谢谢苏安
答案 1 :(得分:0)
不建议在appium中使用Xpath
您可以使用cont-desc,id,resource-id来实现自动化。由于您正在使用xamarin项目,因此可以在项目中添加自动化代码。
然后,您可以在检查应用程序时看到 cont-desc 。然后,您可以将element用作:
el = self.driver.find_elements_by_accessibility_id('ProductName');
答案 2 :(得分:0)
您可以使用其他方法来查找元素,例如id,UIAutomator,类名等。
对于ID,请使用* driver.findElementById(“ id ”)。click();
对于UIAutomator,请使用 driver.findElementByAndroidUIAutomator(“ text(\” Text \“)”)。click();
对于类名,使用 driver.findElementByClassName(“ 类名”)。click();
希望这会有所帮助。
答案 3 :(得分:0)
我通常建议更安全的方法是,在触发单击元素之前的某个时间检查元素的可见性。像这样:
elem_to_find = WebDriverWait(
driver, 5).until(
EC.visibility_of_element_located(
('xpath or id or class of the element, considering xpath in this case', MobileBy.XPATH)))
elem_to_find.click()