Selenium无法找到元素,因为页面源是在Javascript中

时间:2016-03-31 07:49:34

标签: selenium selenium-webdriver

我正在尝试在网页上找到一个元素。如果我做Inspect Element,我可以看到HTML代码和XPATH,但是当我查看页面源时,只有Javascript代码。有关如何查看HTML页面的任何想法吗?

这是页面:https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-50E42369DP1388723#/checkout/login

http://pastebin.com/BGWQikaZ

这是代码。基本上我需要找到元素并填写电子邮件和密码字段

while True:
    try:
        element = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="email"]')))
        login_id = browser.find_element_by_xpath('//*[@id="email"]')

     browser.execute_script("arguments[0].setAttribute('value', 'email address')", login_id)
        login_password = browser.find_element_by_xpath('//*[@id="password"]')
        browser.execute_script("arguments[0].setAttribute('value', 'enter password)", login_password)
        account = browser.find_element_by_id('btnLogin')
        browser.execute_script("arguments[0].click();", account)
        break
    except Exception as e:
        print('Error: Couldnt login')

4 个答案:

答案 0 :(得分:1)

我不知道您使用execute_script的原因。您只需使用sendkeys在网页上设置值。

另一个重要的事情是HTML DOM中存在iframe,因此您需要先切换它。

以下是适用于我的java代码

DataGridView.AllowUserToAddRows

Python代码: -

    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

    WebElement frame = driver.findElement(By.xpath("//iframe[@title='PayPal - Log In']"));

    driver.switchTo().frame(frame); //Switch to frame here

    driver.findElement(By.id("email")).sendKeys("demo");

    driver.findElement(By.id("password")).sendKeys("12345");

    driver.findElement(By.id("btnLogin")).click();

希望它会对你有所帮助:)。

答案 1 :(得分:1)

最好等到页面完全加载,然后切换到frame.and do operations。

IWait<IWebDriver> wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver,     TimeSpan.FromSeconds(30.00));



//check for complete load
wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));

//需要在这里切换到iframe     WebElement frame = driver.findElement(By.xpath(&#34; // iframe [@title =&#39; PayPal - 登录&#39;]&#34;));     driver.switchTo()帧(帧)。

webElment we1= driver.findElement(By.id("email"));
we1.clear();
we1.sendKeys("user@demo.com");

webElment we2=driver.findElement(By.id("password"));
we2.clear();
we2.sendKeys("12345");


driver.findElement(By.id("btnLogin")).click();

答案 2 :(得分:0)

WebElement mast_mod = driver.findElement(By.xpath(".//*[@id='header_dropdown']"));
    driver.manage().timeouts().implicitlyWait(16, TimeUnit.SECONDS);

    Actions menele = new Actions(driver);
    menele.moveToElement(mast_mod).click().build().perform();
    driver.manage().timeouts().implicitlyWait(16, TimeUnit.SECONDS);
    driver.findElement(By.xpath(".//*[@id='jq-dropdown-1']/ul/li[4]")).click();
    driver.findElement(By.id("email")).sendKeys("demo");
    driver.findElement(By.id("password")).sendKeys("12345");
    driver.findElement(By.id("btnLogin")).click();

希望这个解决方案能够帮助您。 如果这对你有帮助,请点赞。

答案 3 :(得分:0)

嗨,基督徒,你正在做的每一件事都是正确的,但在给定的网页上有一个问题,你输入用户名和密码的区域位于iframe =(iframe可以想到html页面内的html页面) .hence在执行任何操作之前,你必须先切换到那个iframe。

public static void main(String[] args) {

        System.setProperty("webdriver.chrome.driver", "D:\\eclipseProject\\###\\src\\com\\smokealignstar\\chromedriver_win32 (1)\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

        driver.get("https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-50E42369DP1388723#/checkout/login");

        // A short way to identify how many iframe's are present on a web page

        List<WebElement> numberOfFrames= driver.findElements(By.tagName("iframe"));
        System.out.println("Total Number of iframes present are : " +numberOfFrames.size());
        for(int i=0;i<numberOfFrames.size();i++){
            // here u can identify iframes with any of its attribute vale say name,title or which is most suitable.
            System.out.println("Name of the i-frames : " + numberOfFrames.get(i).getAttribute("name"));
        }

        // Back to your question - n your case given area of the web page lies inside iframe hence
        // key here is before entering username and password you have to switch to the frame first

        driver.switchTo().frame(driver.findElement(By.name("injectedUl")));
        driver.findElement(By.id("email")).sendKeys("username working");
        driver.findElement(By.id("password")).sendKeys("password working");
    }

有关使用iframe的各种方式的更多信息,请转到以下网址

http://stackoverflow.com/questions/20069737/how-to-identify-and-switch-to-the-frame-in-selenium-webdriver-when-frame-does-no