2016-08-19 13 views
2

私は、Androidデバイス用のセレンサーバー上でAppiumを使ってテストオートメーションを作っていました。オートマティックがTwitterのwebappを起動し、ログインしてTweetを投稿します。しかし、難しかったのは、私のChromeブラウザで既にログインしているアカウントをオートメーションが使用しないということです。毎回ログインする必要があるのはなぜですか?セッションがリフレッシュされるためですか?これを避ける方法はありますか?AppiumモバイルWebテスト自動化Android用Twitter

マイコード:

import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.concurrent.TimeUnit; 
import java.util.logging.Logger; 

import io.appium.java_client.android.AndroidDriver; 
import io.appium.java_client.remote.MobileCapabilityType; 

import org.eclipse.jetty.util.log.Log; 
import org.openqa.selenium.By; 
import org.openqa.selenium.Platform; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.remote.BrowserType; 
import org.openqa.selenium.remote.DesiredCapabilities; 
import org.openqa.selenium.remote.RemoteWebDriver; 
import org.testng.annotations.AfterTest; 
import org.testng.annotations.BeforeTest; 
import org.testng.annotations.Test; 

public class StartChrome 
{ 
private String email="your_email"; 
private String password="your_password"; 
private WebDriver driver=null; 
private int flag=0; 

@BeforeTest 
public void test1() throws MalformedURLException, InterruptedException{ 

// Create object of DesiredCapabilities class and specify android platform 
DesiredCapabilities capabilities=DesiredCapabilities.android(); 


// set the capability to execute test in chrome browser 
capabilities.setCapability(MobileCapabilityType.BROWSER_NAME,BrowserType.CHROME); 

// set the capability to execute our test in Android Platform 
    capabilities.setCapability(MobileCapabilityType.PLATFORM,Platform.ANDROID); 

// we need to define platform name 
    capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME,"Android"); 

// Set the device name as well (you can give any name) 
capabilities.setCapability(MobileCapabilityType.DEVICE_NAME,"my phone"); 

// set the android version as well 
    capabilities.setCapability(MobileCapabilityType.VERSION,"6.0.1"); 

// Create object of URL class and specify the appium server address 
URL url= new URL("http://127.0.0.1:4727/wd/hub"); 

// Create object of AndroidDriver class and pass the url and capability that we created 
WebDriver driver = new AndroidDriver(url, capabilities); 

// Open url 
    driver.get("http://www.twitter.com"); 

// print the title 
    System.out.println("Title "+driver.getTitle()); 
    try{ 
    driver.findElement(By.id("react-root"));  
    }catch(Exception e){ 
     driver.findElement(By.linkText("Log in")).click(); 
     Thread.sleep(3000); 
     driver.findElement(By.name("session[username_or_email]")).sendKeys(email); 
     driver.findElement(By.name("session[password]")).sendKeys(password); 
     driver.findElement(By.id("signupbutton")).click(); 
     Thread.sleep(5000); 
     driver.findElement(By.cssSelector("a[href*='/compose/tweet']")).click();  
     flag=1; 
    } 
    finally{ 
     if(flag==0){ 
      driver.findElement(By.cssSelector("a[href*='/compose/tweet']")).click();  
      } 
    } 
    driver.findElement(By.cssSelector("textarea[aria-label*='Tweet text']")).sendKeys("Test");; 
    //driver.findElement(By.linkText("Tweet")).click(); 
    Thread.sleep(2000); 
    driver.findElement(By.cssSelector("button[data-testid*='Button']")).click(); 


Thread.sleep(2000); 
driver.quit(); 

} 

すべてのヘルプははるかに高く評価されます! :)

答えて

2

Twitterクライアント側を設定してセッションハンドルtoken cookies。このトークンは、資格情報とブラウザの指紋から一般的に構成されたハッシュコードです。 WebDriverは、Cookieがなくても「クリア」なブラウザが毎回起動するので、もちろんサーバーはあなたを認識せず、認証を求めます。

ソリューション:

  • はただ、これを受け入れます。毎回ログインしてください。正常なテストケースに見えます。私はこの決定をお勧めします。
  • トークンクッキーを保存する_twitter_sess
Cookie ck = new Cookie("_twitter_sess", "your_authorised_session_id"); 
    driver.manage().addCookie(ck); 

リスク: 1)このセッションCookieは有効期限があります。毎朝新しいyour_authorised_session_idをcopypasteする必要があります。 2)それは、Twitterがトリッキーなセキュリティシステムを持っている可能性がありますし、彼らはあなたの既存のChrome Profileを使用しbrowser fingerprint

  • をチェックし、それはあなたの履歴が含まれているブラウザの非明確な1 '、あなたのクッキーを意味します。だから、テストを実行する前に手動でtwitterにログインしておく必要があります。
ChromeOptions options = new ChromeOptions(); 
options.addArguments("user-data-dir=C:/Users/user_name<your_path_to_installed_chrome_in_mob_phone_in_your case>/AppData/Local/Google/Chrome/UserData"); 
driver = new ChromeDriver(options); 
+0

ありがとう!それは実際に理にかなっています!私はこれを試してみる –

関連する問題