使用 Selenium、TestNT、Java 进行自动化测试 - Reddit.com - 弹出窗口中的登录按钮

问题描述 投票:0回答:1

我正在尝试弄清楚如何通过 Java/Selenium 自动登录 Reddit。

我已进入 Reddit.com > 登录 > 弹出窗口 > 查找并填写用户名和密码。

但是,无论我尝试什么方法,我似乎都无法集中注意力并单击弹出窗口中的“登录”按钮。我知道在输入适当长度的密码之前该按钮将被禁用,因此我添加了 1 秒睡眠以确保在元素可用之前我不会选择该元素。

我不断收到 noSuchElement 错误。

package org.example;

import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.Test;

import java.util.Iterator;
import java.util.Set;

public class TestCases {

    String userName = "ThrowAwayTestingbot";
    String password = "CEN4072!";

    WebDriver create_driver( char browser){
        if(browser == 'c'){
            System.setProperty("webdriver.chrome.driver","C:\\Users\\pr0je\\Desktop\\Spring2024\\CEN4072 - Software Testing\\FinalGroupProject\\src\\main\\java\\org\\example\\chromedriver.exe");
            return new ChromeDriver();
        }else if(browser == 'f'){
            System.setProperty("webdriver.gecko.driver","C:\\Users\\pr0je\\Desktop\\Spring2024\\CEN4072 - Software Testing\\FinalGroupProject\\src\\main\\java\\org\\example\\geckodriver.exe");
            return new FirefoxDriver();
        }else if(browser == 'e'){
            System.setProperty("webdriver.chrome.driver","C:\\Users\\pr0je\\Desktop\\Spring2024\\CEN4072 - Software Testing\\FinalGroupProject\\src\\main\\java\\org\\example\\msedgedriver.exe");
            return new EdgeDriver();
        }
            else System.out.println("Sorry, we could not start a browser. Attempting to start Chrome.");
            return new ChromeDriver();
    }

    WebDriver driver = create_driver('c');

    @Test
    void test_sign_in() throws InterruptedException {

        // Visit Reddit.com
        driver.get("https://www.reddit.com");
        driver.manage().window().maximize();


        String mainWindow = driver.getWindowHandle();
        String popUp = null;
        WebElement button = driver.findElement(By.id("login-button"));
        button.click();
        Thread.sleep(2000);

        // Get PopUp Info
        Set<String> handles = driver.getWindowHandles();
        Iterator<String> iterator = handles.iterator();
        while(iterator.hasNext()){
            popUp = iterator.next();
        }
        driver.switchTo().window(popUp);


        driver.findElement(By.id("login-username")).sendKeys(userName);
        Thread.sleep(250);
        driver.findElement(By.id("login-password")).sendKeys(password);
        Thread.sleep(1000);

    } // End of Sign In Test

} // END OF TestCases Class

以下是我的一些尝试:

// By Class
       button = driver.findElement(By.className("login w-100\n" +
                "button-large px-[var(--rem14)]\n" +
                "button-brand\n" +
                "\n" +
                "\n" +
                "\n" +
                "items-center justify-center\n" +
                "button inline-flex "));
        button.click();

// By xPath
        button = driver.findElement(By.xpath("//*[@id=\"login\"]/faceplate-tabpanel/auth-flow-modal[1]/div[2]/faceplate-tracker"));
        button.click();

// By Selector
        button = driver.findElement(By.cssSelector("login > faceplate-tabpanel > auth-flow-modal:nth-child(1) > div.w-100 > faceplate-tracker > button"));
        button.click();
java selenium-webdriver automated-tests
1个回答
0
投票

您尝试访问的按钮被埋在一堆嵌套的影子根中。

这是一个帮助您入门的简单示例,

driver.get("http://watir.com/examples/shadow_dom.html");

WebElement shadowHost = driver.findElement(By.cssSelector("#shadow_host"));
SearchContext shadowRoot = shadowHost.getShadowRoot();
WebElement shadowContent = shadowRoot.findElement(By.cssSelector("#shadow_content"));

Assertions.assertEquals("some text", shadowContent.getText());
© www.soinside.com 2019 - 2024. All rights reserved.