2017-01-29 29 views
1

私はAmazonのショッピングアプリでテストしました。私は要素を見つけるためにスワイプした後に問題があります。 リストビューが長すぎます。スワイプAPIを使用してスクロールする必要があります。しかし、私はスワイプした後、私はもう要素をクリックすることはできません。それはエラーを返しませんでしたが、アプリは応答がありません。appiumでスワイプした後に要素をクリックできません

関数ScrollToElement()は、検索要素にスワイプします。私はタッチアクションタップを使用しようとしましたが、希望はありませんでした。私は正確な場所(372,466)をタップしようとしたが、それは動作しますが、それは期待どおりではありません。前もって感謝します。

public class FirstTest { 
    private AppiumDriver driver; 
    private Dimension size; 

    @BeforeClass 
    public void Setup() throws MalformedURLException { 


     String appActivityText = "com.amazon.mShop.home.HomeActivity"; 


     String appPackageText = "in.amazon.mShop.android.shopping"; 

     String fileLocation = "/system/app/"; 

     File classpathRoot = new File(System.getProperty("user.dir")); 
     File appDir = new File(classpathRoot, "\\STC"); 
     File app = new File(appDir, fileLocation); 
     System.out.println(app); 
     DesiredCapabilities capabilities = new DesiredCapabilities(); 

     capabilities.setCapability("device", "Android"); 
     capabilities.setCapability(CapabilityType.BROWSER_NAME, "Android"); 

     capabilities.setCapability(CapabilityType.PLATFORM, "Android"); 

     capabilities.setCapability(CapabilityType.VERSION, "4.4.2"); 

     capabilities.setCapability("deviceName", "420373d0de528100");//420373d0de528100 01a61316598f30e6 

     capabilities.setCapability("newCommandTimeout", "100"); 

     // capabilities.setCapability("app", "Chrome"/*app.getAbsolutePath()*/); 

     capabilities.setCapability("appPackage", appPackageText); 

     capabilities.setCapability("appActivity", appActivityText); 

     driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities); 
     driver.manage().timeouts().implicitlyWait(80, TimeUnit.SECONDS); 

    } 

    @Test 
    public void Login() throws Exception { 
     // Click on Shop by Deparment link 
     driver.manage().timeouts().implicitlyWait(80, TimeUnit.SECONDS); 
     System.out.println("Click on Shop by Deparment link"); 
     driver.findElement(By.id("web_home_shop_by_department_label")).click(); 
     Thread.sleep(1000); 

     WebElement element = driver.findElement(By.name("Office Products Link")); 
     ScrollToElement(driver, element); 

     Thread.sleep(3000); 
//  TouchAction action = new TouchAction(driver); 
//  action.tap(372,466).perform(); 

     driver.findElement(By.name("Office Products Link")).click(); 

    } 
    @AfterClass 
    public void closeApp() { 
     // driver.closeApp(); 

    } 

public static void ScrollToElement(AppiumDriver driver, WebElement element){ 
     size = driver.manage().window().getSize(); 

     // Find swipe start and end point from screen's with and height. 
     // Find starty point which is at bottom side of screen. 
     int start = (int) (size.height * 0.20); 
     int starty = (int) (size.height * 0.80); 
     // Find endy point which is at top side of screen. 
     int endy = (int) (size.height * 0.20); 
     // Find horizontal point where you wants to swipe. It is in middle of 
     // screen width. 
     int startx = size.width/2; 

     while (true) { 
     driver.swipe(startx, starty, startx, endy, 3000); 
     start = start + (starty - endy); 
     if (element.getLocation().getY() - start < size.height - endy) { 
      break; 
     } 
     } 
    } 
} 

答えて

2

コードに問題があると、driver.findElementが間違って使用されています。 私に説明しましょう。 driver.findElementは、画面に表示されている要素を調べ、見つかった場合はそれを返します。

コードの問題は、スクロール機能の前にdriver.findElementを実行することです。つまり、要素が現在画面に表示されていない場合、テストは常に失敗します。

このコードブロックは、あなたを助ける必要があります。

public WebElement findItemWithScrollingUsingBy(By by, int interactions) { 
    for (int i = 0; i < interactions; i++) { 
     if (driver.findElements(by).size() == 0) { 
      scrollDown(); 
     } else { 
      return driver.findElement(by); //you can add .click() here instead of returning the element 
     } 
    } 
    Assert.fail("Element not found"); 
    return null; 
} 

機能scrollDown()はちょうど非常にきれいで、外部関数にスワイプのコードブロックを取ることです。 - 見つかった場合は、

  • をクリックして見つからない場合 -
  • 再び別のスクロールアクションを作成し、要素を検索し、繰り返し
  • 要素の画面上

    1. 検索:私の答えをまとめると

    +0

    実際に。見つけたい要素は既に表示されていますが、リストビューの一番下にあります。 API getsize()、driver.findElement(By.name( "Office Products Link"))、getsize()を使用します。 値を返しました。しかし、要素をクリックすることはできません。そのため、私は要素を提示するために画面をスクロールしようとしました。 私はこれについてはわかりませんが、助けてくれてありがとう – Stephen

    +0

    要素が画面の下部にある場合は、要素を見つけた後に別のスクロールを行う必要があります。あなたができることは - 'starty = ... * 0.6'と 'endy = ... * 0.4'で 'slowScroll()'です。このスクロールの後、アイテムは画面の中央にあります。 。 要素の上部でその座標を使用してtap()を実行することもできます。しかし、まずこれを試してみましょう。 –

    +0

    Davidに感謝しますが、私はappiumの初心者です。 "要素の上部にある座標を使ってtap()を実行する"それはどういう意味ですか?私を導くことができますか? – Stephen

    関連する問題