适用于 Twitter 的 Appium Mobile Web 测试自动化 Android
Appium Mobile Web test automation Android for Twitter
我正在为我的 Android 设备在 selenium 服务器上使用 Appium 制作测试自动化器。自动化程序启动 Twitter 的网络应用程序并进行登录并发布一条推文。但是,我遇到困难的部分是自动化程序没有使用我的 Chrome 浏览器上已经登录的帐户。为什么我每次都要登录?是因为session刷新了吗?有没有办法避免这种情况?
我的代码:
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();
}
非常感谢任何帮助! :)
Twitter
会话句柄通过设置客户端 token cookies。此令牌是哈希码,通常由您的凭据和浏览器指纹组成。由于 WebDriver
每次 'clear' 浏览器都会启动,当然没有 cookie - 服务器无法识别您并要求进行身份验证。
解决方案:
- 就接受这个吧。每次登录。它看起来是理智的测试用例。我会推荐这个决定。
- 保存令牌 cookie
_twitter_sess
。
Cookie ck = new Cookie("_twitter_sess", "your_authorised_session_id");
driver.manage().addCookie(ck);
风险: 1) 此会话 cookie 有过期日期。您将不得不每天早上复制粘贴新 your_authorised_session_id
。 2) Twitter 可能有棘手的安全系统,他们会检查 browser fingerprint
- 使用您现有的
Chrome Profile
,这意味着您的浏览器 'non clear one' 包含您的历史记录,您的 cookie。所以你必须在 运行 测试之前手动登录 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);
我正在为我的 Android 设备在 selenium 服务器上使用 Appium 制作测试自动化器。自动化程序启动 Twitter 的网络应用程序并进行登录并发布一条推文。但是,我遇到困难的部分是自动化程序没有使用我的 Chrome 浏览器上已经登录的帐户。为什么我每次都要登录?是因为session刷新了吗?有没有办法避免这种情况?
我的代码:
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();
}
非常感谢任何帮助! :)
Twitter
会话句柄通过设置客户端 token cookies。此令牌是哈希码,通常由您的凭据和浏览器指纹组成。由于 WebDriver
每次 'clear' 浏览器都会启动,当然没有 cookie - 服务器无法识别您并要求进行身份验证。
解决方案:
- 就接受这个吧。每次登录。它看起来是理智的测试用例。我会推荐这个决定。
- 保存令牌 cookie
_twitter_sess
。
Cookie ck = new Cookie("_twitter_sess", "your_authorised_session_id"); driver.manage().addCookie(ck);
风险: 1) 此会话 cookie 有过期日期。您将不得不每天早上复制粘贴新 your_authorised_session_id
。 2) Twitter 可能有棘手的安全系统,他们会检查 browser fingerprint
- 使用您现有的
Chrome Profile
,这意味着您的浏览器 'non clear one' 包含您的历史记录,您的 cookie。所以你必须在 运行 测试之前手动登录 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);