当前位置: 首页 > 知识库问答 >
问题:

Appium,C#:如何在android中浏览列表

马才
2023-03-14

我一直在使用Appium在C#通过VisualStudio自动化我的工作的Android应用程序。

我需要从Android应用程序中的元素列表中收集详细信息。。。但是我遇到了很多NoTouchElement异常,因为有些元素只显示了视图的一半。如果我“向下滑动”使元素完全可见,我找到的元素列表就会损坏,不再指向正确的元素。。。有什么想法吗?

下面是我面临的一个例子:我有一个10个元素的列表,在手机上你只看到4个元素,其中一个只有一半显示,如果我刷卡,我将不得不再次查找元素,并构建另一个函数来告诉我,我看到的最后一个元素现在是否在查看的新元素集中

 manager.test.Log(Status.Info, "Looking for the element in question and deleting it: ");
 
            int boxsize=0;
            try
            {
                boxsize = manager.Driver.FindElementById("com.unionBank.app:id/main_linear_layout").Size.Height;
            }
            catch (Exception e)
            {
                manager.test.Log(Status.Fail,"Failed to find Elements...");

                throw e;
            }
           
            var screensize = manager.Driver.Manage().Window.Size.Height;
            var Boxes = manager.Driver.FindElementsById("com.unionBank.app:id/main_linear_layout");

      
                for (int i=0; i < Boxes.Count; i++)
            {
                var box = Boxes[i];
                if ((box.Location.Y + boxsize) < screensize)
                {
                    elementDate = box.FindElementById("com.unionBank.app:id/executed_date_text_view").Text.Replace("תאריך ביצוע: ", "");
                    elementStatus = box.FindElementById("com.unionBank.app:id/status_text_view").Text.Replace("סטאטוס: ", "");
                    elementAmount = box.FindElement(GetAmountLocator(manager)).Text.Replace("₪", "").Replace(",","");
                    elementRef = box.FindElementById("com.unionBank.app:id/reference_number_text_view").Text.Replace("אסמכתא: ", "") ;
                  

                    if ((elementDate.Contains(date)) && (elementStatus.Equals(status)) && (elementAmount.Contains(amount)) && (elementRef.Equals(referance)) )
                    {

                        var button = box.FindElementById("com.unionBank.app:id/cancel_operation");
                        button.Click();
                        res += "\nFound the Order to cancel";
                        Thread.Sleep(5000);
                        var  cancelBtn = manager.Driver.FindElementById("com.unionBank.app:id/cancel_order_button");
                        cancelBtn.Click();
                        

                        manager.test.Log(Status.Pass, "Found elemnt <br/> Deleteing element <br/> Done... ");
                        res += "\nDeleted";
                        break;
                    }

                }
                else if ((box.Location.Y + boxsize) > screensize)
                {
                    var move = screensize - (box.Location.Y + boxsize - screensize);
                    manager.Driver.Swipe(0, screensize - 10, 0, move - 20, 800);

                    elementDate = box.FindElementById("com.unionBank.app:id/executed_date_text_view").Text.Replace("תאריך ביצוע: ", "");
                    elementStatus = box.FindElementById("com.unionBank.app:id/status_text_view").Text.Replace("סטאטוס: ", "");
                    elementAmount = box.FindElement(GetAmountLocator(manager)).Text.Replace("₪", "").Replace(",", "");
                    elementRef = box.FindElementById("com.unionBank.app:id/reference_number_text_view").Text.Replace("אסמכתא: ", "");
                     

                    if ((elementDate.Contains(date)) && (elementStatus.Equals(status)) && (elementAmount.Contains(amount)) && (elementRef.Equals(referance)))
                    {

                        var button = box.FindElementById("com.unionBank.app:id/cancel_operation");
                        button.Click();
                        res += "\nFound the Order to cancel";
                        var cancelBtn = manager.Driver.FindElementById("com.unionBank.app:id/cancel_order_button");
                        cancelBtn.Click();
                        manager.test.Log(Status.Pass, "Found elemnt <br/> Deleteing element <br/> Done... ");
                        res += "\nDeleted";
                        break;
                    }

                    var moveNext = screensize- boxsize;
                    manager.Driver.Swipe(0, screensize - 10, 0, moveNext - 10, 800);
                    Boxes = manager.Driver.FindElementsById("com.unionBank.app:id/main_linear_layout");
                    i = 1;


                }
                
            }

共有1个答案

毋修为
2023-03-14

佩列格·沙洛姆。

您的代码过于复杂,没有解决您的主要问题,因为我用Java而不是C实现自动化,我将用一些简单的步骤解释您需要做什么:

>

创建一个函数findElementUsingScrolling(By,int interactions)-在这个函数中,您只需在屏幕中搜索元素,直到它可见为止,基本上您所做的就是-

findElementUsingScrolling(By by, int interactions){
    if (driver.findElements(by).size() == 0){
       scrollDown(); //Element is not on screen, scroll down again
    }else { 
       return; //This means that the element is now on screen
    }
  }

此时,您知道“元素日期”在屏幕上并且可见。现在您终于可以与它交互并更改其文本。

 类似资料:
  • 请有人帮我解决这个问题。提前道谢。当运行java代码在模拟器中打开chrome浏览器时,我收到“无法启动Chromedriver会话:无法创建新会话。详细信息:未创建会话:此版本的Chromedriver仅支持chrome 83版”错误消息。

  • 我已经搜索了这个主题,但我没有得到任何有用的教程。有人能给我指出正确的文档吗?

  • 我有一个应用程序页面,我需要垂直滚动,以达到应用程序的底部保存按钮。 我正在尝试下面的代码,但得到服务器端错误。 有什么好方法可以在android中实现滚动功能吗?

  • 我第一次使用JSON Web令牌(JWT)。我正在制作一个节点。js应用程序。我想使用JWT进行身份验证。根据文档,我将JSON令牌返回到前端。 但是我不知道如何将这个JSON令牌保存到我的浏览器头中,这样它就不会丢失,并随头一起再次发送到后端。如何将它保存在我的浏览器存储中,并在每次向后端发送请求时将其添加到请求头中?

  • 我正在开发一个应用程序,用户可以在其中打开任意多个片段,但所有片段都是唯一类的对象。fragment类在其视图中只有一个WebView。每当用户点击WebView中的链接时,链接就会被加载到一个新的片段中。以下是如何将新片段替换为当前片段: 当用户点击后退按钮时: 一切正常,但我遇到了一些问题,当用户想回去的情况。关键是,当前一个片段从Backback弹出时,它的webview再次开始加载它的ur

  • 我正在尝试配置Robot框架,以便在android模拟器中打开Chrome浏览器。我有这样的代码: 运行脚本时,出现以下错误: 11:10:39.547INFO创建远程WebDriver的实例。 11:10:40.548INFO无法连接到主机上的端口4444127.0.0.1 11:10:40.548INFO无法获取主机的IP地址:127.0.0.1 11:10:41.561FAIL URLErr