【问题标题】:How to identify and click this download-data-link using selenium如何使用 selenium 识别并单击此下载数据链接
【发布时间】:2018-10-06 17:02:21
【问题描述】:
<span class="download-data-link"><a download="" target"_blank"="" style="cursor:pointer">Download file in csv format</a></span>

我需要点击“以 csv 格式下载文件”,但它总是显示该项目不可点击的错误点击查看屏幕截图:

这些我都试过了

element=driver.findElement(By.xpath("//div[@class='download-data-link']/span"));
element.click();

WebDriverWait wait = new WebDriverWait(driver, 20);
WebElement link = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//a[contains(@href,'data:application/csv;')]")));
link.click();

element=driver.findElement(By.xpath("//tr[@class='alt']/span[@class='download-data-link']"));
element.click();

driver.findElement(By.cssSelector(a[class='download-data-link']span)).click();

driver.switchTo().frame("iframe-applicationname_ModalDialog_0");
element=driver.findElement(By.linkText("Download file in csv format"));
element.click();
driver.switchTo().defaultContent();

element = driver.findElement(By.className("downoad-data-link"));
element.click();

这是我最后一年的项目......

网站:https://www.nseindia.com/products/content/equities/indices/historical_index_data.htm

【问题讨论】:

  • 你到底卡在哪一步了?使用错误堆栈跟踪更新问题
  • 点击获取数据按钮后,表格出现了,然后我需要点击 csv 中的下载文件...我无法点击此

标签: selenium selenium-webdriver xpath css-selectors selenium-chromedriver


【解决方案1】:

要单击文本为 以 csv 格式下载文件的链接,您可以使用以下任一定位器策略

  • cssSelector

    driver.findElement(By.cssSelector("span.download-data-link>a")).click();
    
  • xpath

    driver.findElement(By.xpath("//span[@class='download-data-link']/a")).click;
    

更新 A

我仍然不确定为什么您在链接上的click() 被卡住,文本为以 csv 格式下载文件。我可以通过诱导服务员点击该元素来点击链接,如下所示:

  • 示例代码:

    package demo;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.support.ui.ExpectedConditions;
    import org.openqa.selenium.support.ui.WebDriverWait;
    
    public class Q50035477_click_link {
    
        public static void main(String[] args) {
    
            System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
            WebDriver driver = new FirefoxDriver();
            driver.get("https://www.nseindia.com/products/content/equities/indices/historical_index_data.htm");
            driver.findElement(By.cssSelector("input.textboxdata.hasDatepicker#fromDate")).sendKeys("23-04-2018");
            driver.findElement(By.cssSelector("input.textboxdata.hasDatepicker#toDate")).sendKeys("25-04-2018");
            driver.findElement(By.cssSelector("input.getdata-button")).click();
            new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.linkText("Download file in csv format"))).click();
        }
    }
    
  • 浏览器客户端快照:

注意click() 方法稳健强大经过验证。您应该尝试以适当的方式和适当的条件使用click() 方法以避免偏差。粗略的 Actions 类和 JavascriptExecutor 接口各有其可用性,被广泛使用。


更新 B

更大数据的代码块:

    package demo;

    import org.openqa.selenium.By;
    import org.openqa.selenium.JavascriptExecutor;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.firefox.FirefoxDriver;

    public class Q50035477_click_link {

        public static void main(String[] args) {

            System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
            WebDriver driver = new FirefoxDriver();
            driver.get("https://www.nseindia.com/products/content/equities/indices/historical_index_data.htm");
            driver.findElement(By.cssSelector("input.textboxdata.hasDatepicker#fromDate")).sendKeys("01-01-2017");
            driver.findElement(By.cssSelector("input.textboxdata.hasDatepicker#toDate")).sendKeys("31-12-2017");
            driver.findElement(By.cssSelector("input.getdata-button")).click();
            WebElement element = driver.findElement(By.linkText("Download file in csv format"));
            ((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView(true);", element);
            element.click();
        }
    }

注意:浏览器快照保持不变。

【讨论】:

  • 错误;在点 (825,690) 不可点击,其他元素将收到点击
  • 我已经检查了整个 html 文件,这个类或链接文本没有重复
  • 当时间过长时出现问题,例如对于一年的数据,错误正在发生..您的代码在您给定的时间段内很好,但如果日期已定,则会出错2017 年 1 月 1 日至 2017 年 12 月 31 日
  • 我需要另一个帮助stackoverflow.com/questions/50037432/…请检查先生..
  • 先生,请帮助我的另一个问题stackoverflow.com/questions/50037432/…
【解决方案2】:

点击 GetData 按钮后,您需要向下滚动,然后才能与 WebElement 进行交互,这里是您的要求的完整代码:

代码:

公开课 M{

static WebDriver driver;
static WebDriverWait wait;

public static void main(String[] args) throws InterruptedException {

        System.setProperty("webdriver.chrome.driver", "F:\\Automation_Learning\\chromedriver.exe");
        driver = new ChromeDriver();
        wait =new WebDriverWait(driver, 10);
        driver.manage().window().maximize();
        driver.get("https://www.nseindia.com/products/content/equities/indices/historical_index_data.htm");
        wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector("div[class='content']"))));
        wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("input[class$='hasDatepicker'][id='fromDate']")));
        driver.findElement(By.cssSelector("input[class$='hasDatepicker'][id='fromDate']")).click();
        wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.id("ui-datepicker-div"))));
        driver.findElement(By.cssSelector(".ui-datepicker-month")).click();
        selectDate(driver.findElement(By.cssSelector(".ui-datepicker-month")),"Jan" );
        driver.findElement(By.cssSelector(".ui-datepicker-year")).click();
        selectDate(driver.findElement(By.cssSelector(".ui-datepicker-year")), "2017");
        driver.findElement(By.xpath("//table[@class='ui-datepicker-calendar']/descendant::td[contains(@class,'ui-datepicker-week-end')]/a[text()='1']")).click();

        wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("input[class$='hasDatepicker'][id='toDate']")));
        driver.findElement(By.cssSelector("input[class$='hasDatepicker'][id='toDate']")).click();

        wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.id("ui-datepicker-div"))));

        driver.findElement(By.cssSelector(".ui-datepicker-month")).click();
        selectDate(driver.findElement(By.cssSelector(".ui-datepicker-month")),"Dec");
        driver.findElement(By.cssSelector(".ui-datepicker-year")).click();
        selectDate(driver.findElement(By.cssSelector(".ui-datepicker-year")), "2017");

        driver.findElement(By.xpath("//table[@class='ui-datepicker-calendar']/descendant::td[contains(@class,'ui-datepicker-week-end')]/a[text()='31']")).click();
        wait.until(ExpectedConditions.elementToBeClickable(By.id("get")));
        driver.findElement(By.id("get")).click();
        wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector("div[class$='data-historic']"))));


        Actions action = new Actions(driver);
        action.keyDown(Keys.LEFT_CONTROL).sendKeys(Keys.END).keyUp(Keys.LEFT_CONTROL).build().perform();;

        wait.until(ExpectedConditions.elementToBeClickable(By.linkText("Download file in csv format")));
        driver.findElement(By.linkText("Download file in csv format")).click();
}

    public static void selectDate(WebElement element , String textToBeSelected){
        Select select = new Select(element);
        select.selectByVisibleText(textToBeSelected);
    }

}

【讨论】:

  • 它的工作时间很短......当我需要一年的数据时它不起作用
  • 01-01-2017 到 31-12-2017 将这些日期作为字符串,然后将其放入扇区
  • 你能帮忙吗...我已经接受了 1 年的输入,但它不起作用
  • 我已经得到了我需要的东西..但是如果你请使用 css 选择器或通过 linktext 或通过部分墨迹文本更新代码 1 年,这将是有帮助的
  • 但由于它与 js 执行器 JavascriptExecutor js = (JavascriptExecutor) 驱动程序一起使用; js.executeScript("arguments[0].click();",driver.findElement(By.xpath("//span[@class='download-data-link']//a")));跨度>
【解决方案3】:

你可以使用相同的动作类,

Actions action = new Actions(driver);
action.moveToElement(driver.findElement(By.xpath("//span[@class='download-data-link']//a"))).click().perform();

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].click();",driver.findElement(By.xpath("//span[@class='download-data-link']//a")));

【讨论】:

猜你喜欢
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
  • 2022-01-28
  • 2017-12-25
  • 2016-06-13
  • 2019-12-14
  • 1970-01-01
  • 2021-06-25
相关资源
最近更新 更多