Selenium webdriver 如何使用selenium在网页上单击动态链接,如广告

Selenium webdriver 如何使用selenium在网页上单击动态链接,如广告,selenium-webdriver,Selenium Webdriver,我是SeleniumWebDriver的新手,正在尝试测试一个包含一些动态链接(动态广告)的网页。例如:广告 我尝试使用xpath、classname和id,但这些都不起作用。这是因为每次页面上显示新内容时,都无法找到元素并在线程“main”中引发异常: 我的代码是: package Selenium; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.

我是SeleniumWebDriver的新手,正在尝试测试一个包含一些动态链接(动态广告)的网页。例如:广告

我尝试使用xpath、classname和id,但这些都不起作用。这是因为每次页面上显示新内容时,都无法找到元素并在线程“main”中引发异常:

我的代码是:

package Selenium;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;

public class Image_Link {

    static WebDriver driver ;
    public static void main(String[] args) throws InterruptedException {
        // TODO Auto-generated method stub


        //System.setProperty("webdriver.chrome.driver", "E://chromedriver_win32//chromedriver.exe");
        //driver = new ChromeDriver();
        System.setProperty("webdriver.gecko.driver", "E://geckodriver-v0.21.0-win64//geckodriver.exe");
        driver = new FirefoxDriver();
        Actions actions = new Actions(driver);
        driver.get("https://mail.rediff.com/cgi-bin/login.cgi");
        //WebElement Dynamic_ads=driver.findElement(By.className("rhs-area floatR"));
        WebElement Dynamic_ads=driver.findElement(By.id("map"));
        actions.moveToElement(Dynamic_ads).perform();
        WebElement ad_Link = driver.findElement(By.cssSelector("#map > area:nth-child(2)"));
        actions.moveToElement(ad_Link);
        actions.click();
        actions.perform();

        //driver.navigate().to("www.google.com");

        //String value = driver.findElement(By.id("hplogo")).getAttribute("title");


    }

}

无法找到动态广告的元素,因为它尚未在加载页面上完全加载。我建议为您要查找的特定add添加一个明确的等待时间。你可以在这里查看更多信息

无论如何,以下是您的解决方案:

1.)实现WebDriverWait:
WebDriverWait wait=newWebDriverWait(驱动程序,20)

2.)将您的
Dynamic_ads
数据更改为
wait.until(预期条件。元素的可见性(按.id(“地图”))然后执行
动态广告。单击()之后


2.)将
Dynamic_ads
数据更改为
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(“//map[@id='map']/*”))然后执行
动态广告。单击()之后。注意:这将选择第一个子节点。

感谢您的帮助……但每次打开浏览器(手动或通过selenium)时,都会显示一组不同的广告……因此该特定元素在页面上不可见。我想验证页面上显示的广告是否可单击(例如:rediff登录页面)。如果要验证页面上显示的广告是否可单击,请执行相同的操作,但稍微将步骤2修改为:
wait.till(ExpectedConditions.elementToBeClickable(By.xpath(“//map[@id='map']/*”));然后做动态广告。点击()注意:将选择的元素将是映射的第一个子元素。我尝试了以上代码行,但相同的错误显示为“无此类元素”。尽管我试图找出即使在打开新浏览器时也是常量的元素//标识广告区域WebElement Dynamic_ads=wait.until(ExpectedConditions.elementtobelickable(By.className(“广告区域”));动态广告。点击();您还添加了明确的等待时间?这样元素就有足够的时间加载了吗?是的,我还尝试了WebElement Dynamic_ads=wait.until(ExpectedConditions.elementToBeClickable(By.className(“广告区”));动态广告。点击();由于整个广告区域都是可点击的,所以现在它将重新发布购物网站。但我想点击登录页面上显示的特定产品链接。我发现,每当打开新浏览器时,无论该页面上加载的广告是什么,image map的子节点1、2等的cssSelector将保持与“#map>area:n child(1)”相同,“#map>area:nth child(2)”等,但当我使用它时,面临同样的问题
package Selenium;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;

public class Image_Link {

    static WebDriver driver ;
    public static void main(String[] args) throws InterruptedException {
        // TODO Auto-generated method stub


        //System.setProperty("webdriver.chrome.driver", "E://chromedriver_win32//chromedriver.exe");
        //driver = new ChromeDriver();
        System.setProperty("webdriver.gecko.driver", "E://geckodriver-v0.21.0-win64//geckodriver.exe");
        driver = new FirefoxDriver();
        Actions actions = new Actions(driver);
        driver.get("https://mail.rediff.com/cgi-bin/login.cgi");
        //WebElement Dynamic_ads=driver.findElement(By.className("rhs-area floatR"));
        WebElement Dynamic_ads=driver.findElement(By.id("map"));
        actions.moveToElement(Dynamic_ads).perform();
        WebElement ad_Link = driver.findElement(By.cssSelector("#map > area:nth-child(2)"));
        actions.moveToElement(ad_Link);
        actions.click();
        actions.perform();

        //driver.navigate().to("www.google.com");

        //String value = driver.findElement(By.id("hplogo")).getAttribute("title");


    }

}