gpt4 book ai didi

java - 如何使用 selenium webdriver 从第三方网站下载文件

转载 作者:行者123 更新时间:2023-12-02 04:08:49 25 4
gpt4 key购买 nike

我正在自动化一个流程,其中我应该能够登录网站并自动下载和重命名文件。

  1. 它应该仅下载以“06”结尾的 csv 文件。
  2. 它应该将报告 ID 与报告类型进行比较。示例:如果报告 ID 为“XXXXXX06”且报告类型以“PAS”开头,则应使用 XXXXXX06 PAS.csv 重命名文件名,同样如果报告 ID 为“XXXXXX06”且报告类型以“TAS”开头,则应重命名文件名 XXXXXX06 TAS.csv

我附上代码。我只是无法下载和重命名该文件,其余所有功能都工作正常。我认为提供 xpath 存在一些问题。

enter image description here

package package1;
import java.io.File;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;

import java.util.List;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.chrome.ChromeDriver;

import org.openqa.selenium.chrome.ChromeOptions;

import org.openqa.selenium.remote.CapabilityType;

import org.openqa.selenium.remote.DesiredCapabilities;


public class Test_new {

public static WebDriver setup() throws Exception

{
String downloadFilepath = "E:\\HCA_Automation\\Files";
System.out.println(downloadFilepath);
HashMap<String, Object> chromePrefs = new HashMap<String, Object>();

chromePrefs.put("profile.default_content_settings.popups", 0);

chromePrefs.put("download.default_directory", downloadFilepath);

ChromeOptions options = new ChromeOptions();

options.setExperimentalOption("prefs", chromePrefs);

DesiredCapabilities cap = DesiredCapabilities.chrome();

cap.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);

cap.setCapability(ChromeOptions.CAPABILITY, options);

//WebDriver driver = new ChromeDriver(cap);

WebDriver wd;

//String exepath=System.getProperty("user.dir") + "//chromedriver.exe";

System.setProperty("webdriver.chrome.driver",
"C:\\Users\\sh370472\\Downloads\\chromedriver_win32 (1)\\chromedriver.exe");

return (wd= new ChromeDriver(cap));

}


public static void login(WebDriver wd) throws Throwable
{
wd.manage().window().maximize();
wd.get("https://www.shipper-ml.com");
wd.findElement(By.id("inpUserId")).sendKeys("XXXXXXXX");
wd.findElement(By.id("inpPassword")).sendKeys("XXXXXXXXXXXX");
wd.findElement(By.id("btnLogonLabel")).click();
Thread.sleep(1000);
}

public static void execute(WebDriver wd) throws Throwable{
wd.get("https://www.shipper-ml.com/viewReports.do");
Thread.sleep(2000);
List<WebElement> list= wd.findElements(By.xpath("//table[@class='lcb']/tbody/tr/td/table[@class='ibody']/tbody/tr/td[contains(translate(text(),'0123456789'),'06')]/parent::tr/td[7]/a"));
int i = 0;
FileUtils.cleanDirectory(new File("E:\\HCA_Automation\\Files"));
for (WebElement element:list)
{
i++;
element.click();
Thread.sleep(1000);
System.out.println((element.findElement(By.xpath("(//table[@class='lcb']/tbody/tr/td/table[@class='ibody']/tbody/tr/td[contains(translate(text(), '0123456789'),'06')]/parent::tr/td[3])["+i+"]")).getText()).substring(0,2));
String report_type = (element.findElement(By.xpath("(//table[@class='lcb']/tbody/tr/td/table[@class='ibody']/tbody/tr/td[contains(translate(text(), '0123456789'),'06')]/parent::tr/td[3])["+i+"]")).getText()).substring(0,2);

}
}


public static void tearDown(WebDriver wd) throws Throwable{
wd.quit();
}



public static void main(String[] args) throws Throwable
{
WebDriver wd = setup();
login(wd);
execute(wd);
tearDown(wd);
Thread.sleep(1000);
FileUtils.copyDirectory(new File("C:\\Users\\nea558\\Desktop\\New_Folder\\Files\\TAS\\"), new File( "\\\\zneugo1p17ecn02.bp1.ad.bp.com\\DataTransfer\\ETAP\\DropBoxes\\CATS\\01_Inbox"));

//FileUtils.copyDirectory(new File("C:\\Users\\nea558\\Desktop\\New_Folder\\Files\\PAS\\"), new File("\\\\bp1xeuap2433\\aamon\\scheduler\\Handoffs\\paa\\itd\\process"));

}

}

HTML:

<div id="lc_ctrl258037362">
<table id="ctrl258037362" cellspacing="0" width="845px" class="lc_nf" border="0" cellpadding="0">
<tbody>
<tr>
<td>
<table cellspacing="0" width="100%" class="lcb" border="0" cellpadding="0">
<tbody>
<tr>
<td>
<table cellspacing="1" width="100%" class="ibody" border="0" cellpadding="0">
<colgroup>
<col>
<col>
<col>
<col>
<col>
<col>
<col>
<col>
</colgroup>
<tbody>
<tr class="header">
<td>Report ID</td>
<td>Version No.</td>
<td>Report Type</td>
<td>Contract</td>
<td>Date Created</td>
<td>Status</td>
<td align="center">Excel</td>
<td align="center">XML</td>
</tr>
<tr onmouseover="high(this);" class="even" onmouseout="low(this);" style="">
<td class="cl">19062006</td>
<td class="cl">V1</td>
<td class="cl">PAS ITD/EOD EX1 Allocation Statement</td>
<td class="cl">ETAP</td>
<td class="cl">21/06/2019 08:56</td>
<td class="cl">Published</td>
<td align="center" class="cl">
<a href="/viewReports.do?ctrl=reportListForDownload&amp;action=DownloadReport&amp;param=0" target="_blank">
<img vspace="0" align="absmiddle" border="0" src="images/buttons/excel.gif"></a></td>
<td align="center" class="cl"><a href="/viewReports.do?ctrl=reportListForDownload&amp;action=DownloadXml&amp;param=0" target="_blank"><img
vspace="0" align="absmiddle" border="0" src="images/buttons/document.gif"></a></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</div>

最佳答案

找到下载链接的 XPath 如下:

//table/descendant-or-self::tr[td[3][text()='PAS ITD/EOD EX1 Allocation Statement']]/td[7]/a

这会找到 <table>包含 <tr> 的元素具有 <td> 的元素值为 PAS ITD/EOD EX1 Allocation Statement 的元素然后将您路由至<td>包含下载链接的同一行中的元素。

要将其放入可以调整报告类型值的代码中,您可以使用:

String reportTypeValue = "PAS ITD/EOD EX1 Allocation Statement"
driver.findElement(By.xpath("//table/descendant-or-self::tr[td[3][text()='" + reportTypeValue + "']]/td[7]/a")

*编辑*

根据您的评论,您变得更加复杂,我现在有:

//table/descendant-or-self::tr[td[1][substring(text(), string-length(text()) - string-length('06') + 1)]][td[3][text()='PAS ITD/EOD EX1 Allocation Statement']]/td[7]/a

这将找到 <table>包含 <tr> 的元素具有 <td> 的元素值为 PAS ITD/EOD EX1 Allocation Statement 的元素和一个 <td>以值 06 结尾的元素。然后它会将您路由到 <td>包含下载链接的同一行中的元素。

XPath 1.0 不支持结尾,因此这个 block :

substring(text(), string-length(text()) - string-length('06') + 1)]

这会计算出文本节点的长度和您正在搜索的字符串的长度,并使用子字符串功能来确保最后 x 个字符匹配。

要将其放入新的代码块中,您可以使用它来调整报告类型值和报告 ID,您可以执行以下操作:

String reportID = "06"
String reportTypeValue = "PAS ITD/EOD EX1 Allocation Statement"
driver.findElement(By.xpath("//table/descendant-or-self::tr[td[1][substring(text(), string-length(text()) - string-length('" + reportID + "') + 1)]][td[3][text()='" + reportTypeValue + "']]/td[7]/a")

关于java - 如何使用 selenium webdriver 从第三方网站下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56702043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com