Как скачать файл с помощью selenium webdriver с третьего сайта - PullRequest
0 голосов
/ 21 июня 2019

Я автоматизирую процесс, при котором я должен иметь возможность войти на веб-сайт и автоматически загружать и переименовывать файлы.

  1. Он должен загружать только файлы CSV, заканчивающиеся на «06».
  2. Он должен сопоставить идентификатор отчета с типом отчета. Пример: если идентификатор отчета равен «XXXXXX06», а тип отчета начинается с «PAS», ему следует переименовать имя файла с помощью XXXXXX06 PAS.csv, то же самое происходит, если идентификатор отчета равен «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>

1 Ответ

0 голосов
/ 21 июня 2019

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 не поддерживает окончание - отсюда этот блок:

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

Это работаетдлина текстового узла и длина искомой строки и использование функции подстроки, чтобы обеспечить совпадение последних символов x.

Чтобы поместить его в новый блок кода, который вы можете использоватьнастроить значение типа отчета и идентификатор отчета, который вы можете сделать:

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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...