如何自动化团队合作备份下载
How To Automate Teamwork Backup Download
我正在尝试自动下载 Teamwork 创建的备份文件。它的工作方式是您登录,转到一个页面,该页面使用 src="https://tw-backup.teamwork.com/ext.cfm?backupaction=downloadLatestMySQLBackup".
加载动态生成的 iframe
我试过从 iframe 获取实际的 link,但我还没有让它工作。但是,如果我在浏览器中输入它,我正在使用的截断 link 似乎可以正常工作。所以我只是想直接打开它。
不幸的是,它似乎挂了。
编辑
phantomjs --version = 1.9.8;
出现此错误:
[debug] [phantom] url changed to "https://tw-backup.teamwork.com/ext.cfm?backupa
ction=downloadLatestMySQLBackup"
[debug] [phantom] Successfully injected Casper client-side utilities
[info] [phantom] Done 8 steps in 3427ms
finished
Unsafe JavaScript attempt to access frame with URL about:blank from frame with U
RL file:///c:/Users/Brad/AppData/Roaming/npm/node_modules/casperjs/bin/bootstrap
.js. Domains, protocols and ports must match.
问题是我尝试访问的子域与我开始访问的子域不同吗?
如果您对此问题感兴趣,可以免费试用 Teamwork。顺便说一句,我们正在将它很好地用于项目管理。
var casper = require('casper').create();
casper.start('https://myco.teamwork.com/', function () {
console.log("start");
this.waitForSelector("input[name='userLogin']",
function success() {
this.sendKeys("input[name='userLogin']", "me@myco.org");
},
function fail() {
test.assertExists("input[name='userLogin']");
});
this.waitForSelector("input[name='password']",
function success() {
this.sendKeys("input[name='password']", "somePassword");
console.log("login successful");
},
function fail() {
test.assertExists("input[name='password']");
console.log("login failed");
});
this.thenOpen('https://tw-backup.teamwork.com/ext.cfm?backupaction=downloadLatestMySQLBackup');
});
我最终通过移动到 Selenium 并使用 Chrome 驱动程序实现了这一点;Firefox 驱动程序将无法工作,因为它会弹出一个保存对话框。
不幸的是,我还没有完成这项工作。我希望 HtmlUnitDriver 能工作。它仍然有可能,但就我的目的而言,打开浏览器实际上是可以的。
请注意,您需要安装 Chrome webdriver。在 MAC 上,您只需将其放入 /usr/bin。在 Windows 上,创建一个包含 .jar 和 chromedriver.ext 的文件夹。然后执行:
C:\Program Files\teamworkbackup>java -Dwebdriver.chrome.driver=:"C:\Program files\teamworkdbackup\chromedriver.exe" -jar teamworkdbackup.jar
源代码:
package com.rhoads.teamwork.backup;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.concurrent.TimeUnit;
public class TeamworkBackup {
public static void main(String[] args) throws Exception {
WebDriver driver;
String baseUrl;
driver = new ChromeDriver();
baseUrl = "https://myco.teamwork.com/index.cfm";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.get(baseUrl + "/");
Thread.sleep(4000);
driver.findElement(By.id("password")).clear();
driver.findElement(By.id("password")).sendKeys("superstrong");
driver.findElement(By.id("userLogin")).clear();
driver.findElement(By.id("userLogin")).sendKeys("someguy@example.com");
driver.findElement(By.id("ordLoginSubmitBtn")).click();
Thread.sleep(4000);
driver.get("https://myco.teamwork.com/settings?display=export");
Thread.sleep(4000);
driver.switchTo().frame("backupFrame");
Thread.sleep(4000);
driver.findElement(By.linkText("Download")).click();
Thread.sleep(4000);
driver.quit();
}
}
我正在尝试自动下载 Teamwork 创建的备份文件。它的工作方式是您登录,转到一个页面,该页面使用 src="https://tw-backup.teamwork.com/ext.cfm?backupaction=downloadLatestMySQLBackup".
加载动态生成的 iframe我试过从 iframe 获取实际的 link,但我还没有让它工作。但是,如果我在浏览器中输入它,我正在使用的截断 link 似乎可以正常工作。所以我只是想直接打开它。
不幸的是,它似乎挂了。
编辑
phantomjs --version = 1.9.8;
出现此错误:
[debug] [phantom] url changed to "https://tw-backup.teamwork.com/ext.cfm?backupa
ction=downloadLatestMySQLBackup"
[debug] [phantom] Successfully injected Casper client-side utilities
[info] [phantom] Done 8 steps in 3427ms
finished
Unsafe JavaScript attempt to access frame with URL about:blank from frame with U
RL file:///c:/Users/Brad/AppData/Roaming/npm/node_modules/casperjs/bin/bootstrap
.js. Domains, protocols and ports must match.
问题是我尝试访问的子域与我开始访问的子域不同吗?
如果您对此问题感兴趣,可以免费试用 Teamwork。顺便说一句,我们正在将它很好地用于项目管理。
var casper = require('casper').create();
casper.start('https://myco.teamwork.com/', function () {
console.log("start");
this.waitForSelector("input[name='userLogin']",
function success() {
this.sendKeys("input[name='userLogin']", "me@myco.org");
},
function fail() {
test.assertExists("input[name='userLogin']");
});
this.waitForSelector("input[name='password']",
function success() {
this.sendKeys("input[name='password']", "somePassword");
console.log("login successful");
},
function fail() {
test.assertExists("input[name='password']");
console.log("login failed");
});
this.thenOpen('https://tw-backup.teamwork.com/ext.cfm?backupaction=downloadLatestMySQLBackup');
});
我最终通过移动到 Selenium 并使用 Chrome 驱动程序实现了这一点;Firefox 驱动程序将无法工作,因为它会弹出一个保存对话框。
不幸的是,我还没有完成这项工作。我希望 HtmlUnitDriver 能工作。它仍然有可能,但就我的目的而言,打开浏览器实际上是可以的。
请注意,您需要安装 Chrome webdriver。在 MAC 上,您只需将其放入 /usr/bin。在 Windows 上,创建一个包含 .jar 和 chromedriver.ext 的文件夹。然后执行:
C:\Program Files\teamworkbackup>java -Dwebdriver.chrome.driver=:"C:\Program files\teamworkdbackup\chromedriver.exe" -jar teamworkdbackup.jar
源代码:
package com.rhoads.teamwork.backup;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.concurrent.TimeUnit;
public class TeamworkBackup {
public static void main(String[] args) throws Exception {
WebDriver driver;
String baseUrl;
driver = new ChromeDriver();
baseUrl = "https://myco.teamwork.com/index.cfm";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.get(baseUrl + "/");
Thread.sleep(4000);
driver.findElement(By.id("password")).clear();
driver.findElement(By.id("password")).sendKeys("superstrong");
driver.findElement(By.id("userLogin")).clear();
driver.findElement(By.id("userLogin")).sendKeys("someguy@example.com");
driver.findElement(By.id("ordLoginSubmitBtn")).click();
Thread.sleep(4000);
driver.get("https://myco.teamwork.com/settings?display=export");
Thread.sleep(4000);
driver.switchTo().frame("backupFrame");
Thread.sleep(4000);
driver.findElement(By.linkText("Download")).click();
Thread.sleep(4000);
driver.quit();
}
}