无法选择已在appium(python selenium)中的元素中的元素

无法选择已在appium(python selenium)中的元素中的元素,python,appium,Python,Appium,我正在Android应用程序中自动登录页面,在用户名文本框旁边有一个国家/地区选项可供选择,然后再登录 我想做的是: 尝试点击国旗元素,然后它将打开一个页面选择登录哪个国家 我所做的: 在Appium中,通过选择标志元素,用户名或电子邮件地址部分被选中。因此用户名的元素id被显示,所以,我选择了使用坐标的标志部分,但发生的事情对我来说是可行的,但问题是在不同的显示大小的android设备上,它无法在相同的坐标中找到该元素 代码: TouchAction(驱动程序)。轻按(无、651、796、1)

我正在Android应用程序中自动登录页面,在用户名文本框旁边有一个国家/地区选项可供选择,然后再登录

我想做的是:

尝试点击国旗元素,然后它将打开一个页面选择登录哪个国家

我所做的:

在Appium中,通过选择标志元素,用户名或电子邮件地址部分被选中。因此用户名的元素id被显示,所以,我选择了使用坐标的标志部分,但发生的事情对我来说是可行的,但问题是在不同的显示大小的android设备上,它无法在相同的坐标中找到该元素

代码:
TouchAction(驱动程序)。轻按(无、651、796、1)。执行()

在这种情况下我该怎么办?有什么想法吗?


这是因为页面上元素的层次结构

您正在尝试点击某个位置,但实际发生的情况是UI Automator(或您正在使用的其他驱动程序)可能会点击您不可见的不同布局元素

解决方案:

您应该找到完整的xpath层次结构,然后对其执行操作

driver.findElement(By.xpath("*{your elements full hierarchy XPATH}*")).getText();
例如:

driver.findElement(By.xpath("//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.support.v4.widget.i[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.ViewGroup[1]/android.view.ViewGroup[1]/android.support.v4.view.ViewPager[1]/android.view.ViewGroup[1]/android.widget.RelativeLayout[1]/android.widget.FrameLayout[1]/android.support.v7.widget.RecyclerView[1]/android.support.v7.widget.RecyclerView[1]/android.widget.LinearLayout[2]/android.widget.TextView[2]")).getText();
为此,我使用并建议使用Katalon Studio>Spy工具(而不是android SDK中的UiAutomator2工具)

这是Katalon Studio间谍工具的屏幕截图。(XPATH地址值很容易复制,我只是将其悬停以显示我所说的内容。)


希望这有帮助。

尝试下面的代码&相应地,您需要计算x&y坐标

        MobileElement element = (MobileElement) driver.findElementByXPath("//*[@name=Username or email adddress]");
        int y_coodinate = (element.getLocation().getY() + element.getLocation().getY() + element.getSize().height) / 2;
        int x_coodinate = element.getLocation().getX() + element.getSize().width - (element.getLocation().getX() + element.getLocation().getX() + element.getSize().width) / 10;
        new TouchAction(driver).longPress(PointOption.point(x_coodinate, y_coodinate)).release().perform();

你可以分享你的自动代码吗?你可能没有该元素的id,你可以使用主元素的x,y坐标单击该元素,并进行一些数学计算,这样,如果你运行任何设备,它都会work@Mani这就是我现在正在做的,但是所有不同设备的坐标都会改变。如何解决这一问题对我来说是个问题?这没有帮助,因为该标志部分没有元素id根据您的代码,我应该在哪里提到标志所在的x和y坐标?你的确切意思是什么?我也在用python编写代码。如果你想理解,可以通过任何聊天渠道连接。当然,我很高兴获得更多信息:)请告诉我你方便的方式