当前位置: 首页 > 知识库问答 >
问题:

Selenium webdriver xpath随机无法识别

艾俊悟
2023-03-14

下面的代码应该做到以下几点:1。连接到www.brainly.ro并使用凭据2登录。打开用户窗口Lola1511 3。打开所有已回答的问题,查看是否已通过审核。如果未批准,则批准。

下面我发布了我的整个代码(到站点的链接和凭据都在那里)

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

public class classTest {
    WebDriver driver;

    @BeforeTest
    public void invokeBrowser() {
        try {

            System.setProperty("webdriver.chrome.driver",
                    "C:\\Users\\sanduc\\Desktop\\Selenium\\Kits\\chromedriver_win32\\chromedriver.exe");
            driver = new ChromeDriver();
            driver.manage().window().maximize();
            driver.manage().deleteAllCookies();
            driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
            driver.manage().timeouts().pageLoadTimeout(40, TimeUnit.SECONDS);
            driver.get("");

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Test(priority = 1)
    public void log_in() {

        try {
            driver.findElement(
                    By.xpath("//div[@class='sg-content-box__actions']/nav[@class='brn-hero__navigation']/a[1]"))
                    .click();
            driver.findElement(By.xpath("//form[@action='/login?entry=2&return=/']/div[2]/input"))
                    .sendKeys("my_emal@mail.com");
            driver.findElement(By.xpath("//form[@action='/login?entry=2&return=/']/div[3]/input"))
                    .sendKeys("my_password");
            driver.findElement(By.xpath("//button[@type='submit']")).click();
            Thread.sleep(4000);
            driver.get("");
        } catch (InterruptedException e) {

            e.printStackTrace();
        }
    }

    @Test(priority = 2)
    public void click_pages() {
        try {
            int index_while = 1;

            while (true) {
                driver.get("" + index_while);
                List<WebElement> demovar = driver.findElements(By.xpath("//div[@class='task-content']/a"));
                System.out.println(demovar.size());
                System.out.println("+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+");
                System.out.println("Current page: " + driver.getCurrentUrl());
                System.out.println("+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+");

                ArrayList<String> hrefs = new ArrayList<String>(); // List for
                                                                    // storing
                                                                    // all href
                                                                    // values
                                                                    // for 'a'
                                                                    // tag

                for (WebElement var : demovar) {
                    System.out.println(var.getText()); // used to get text
                                                        // present between the
                                                        // anchor tags
                    System.out.println(var.getAttribute("href"));
                    hrefs.add(var.getAttribute("href"));
                    System.out.println("*************************************");
                }

                // Navigating to each link
                int i = 0;
                for (String href : hrefs) {
                    driver.navigate().to(href);
                    System.out.println((++i) + ": navigated to URL with href: " + href);
                    approveAnswerByUsername("Lola1511");
                    Thread.sleep(3000); // To check if the navigation is
                                        // happening properly.
                    System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");

                }
                index_while++;
                if (demovar.size() < 5) {
                    break;
                }
            }
        } catch (InterruptedException e) {

            e.printStackTrace();
        }

    }

    public void approveAnswerByUsername(String username) {
        try {

            if (driver.findElement(By.xpath("//a[contains(.,'" + username
                        + "')]/ancestor::div[contains(@class, 'js-answer-element')]//span[@class='sg-icon-as-button__hole']")).isDisplayed()) {
                System.out.println("The homework " + driver.getCurrentUrl() + " has ALREADY been approved");

            } else {

                driver.findElement(By.xpath("//a[contains(.,'" + username
                        + "')]/ancestor::div[contains(@class, 'js-answer-element')]//div[contains(@class,'js-approve-button-text')][contains(.,'Aprobă')]")).click();
                Thread.sleep(2000);
                driver.navigate().refresh();
                System.out.println("The homework " + driver.getCurrentUrl() + " has been approved NOW");

            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

共有1个答案

谷玉韵
2023-03-14

由于时间限制,我无法检查代码,但我会建议使用选择器的不同方法。

在网页中使用ID选择器或名称选择器,而不是XPath。

ID选择器是选择元素的最佳和最快的方法。XPath速度较慢,有时也不可靠。

 类似资料:
  • 我格式化了我的电脑,再次安装了windows 10,因为我想玩,Linux有问题。我正在尝试安装flutter和dart用于应用程序开发,但他指责这个错误。 颤振医生 在将颤振更改为beta之前,我对它进行了测试,它识别出颤振和飞镖插件,但我想将其保留在稳定通道中。 但是,我的代码无法识别它,我相信这是因为flutter和dart插件的这些错误。 密码 我已经通过android Studio和vs

  • uniapp 链接手机调试,无法识别手机? 打开了usb 调试模式,把手机查到同事电脑上可以识别,本电脑之前也可以,但是重装系统后就不行了,请问如何解决?

  • 我试图随机化一个字节数组,但它不允许我编译它,因为下面的错误。它甚至不适用于而不是。 错误C2338:independent_bits_engine的无效模板参数:N465929.6.1.1[rand.req.genl]/1f需要un有符号短、无符号int、无符号长或无符号长 消息:请参阅类模板实例化的d::independent_bits_engine 错误C2338:注意:不允许使用字符、有符

  • 我已在全球范围内安装了react native cli: 然后运行: 我得到了以下结构: 当我运行react native run android时,我得到一个错误: 命令无法识别。你的意思是在一个本地项目中运行这个吗? 当我开始跑步时,我也会得到同样的结果。 反应原生-v 打印: 反应原生-cli: 0.2.0 反应原生:n/a-不在反应原生项目目录中 我做错了什么?

  • 问题内容: 我正在使用Hibernate / JPA执行本地PostGIS查询。这些查询的问题在于它们需要的参数不是经典的X =“值”形式。 例如,以下几行崩溃 但是,以下查询有效: (但是它很容易出现SQL注入…) 有谁知道如何在这种情况下使用? 问题答案: 未为本机查询定义使用命名参数。根据JPA规范(第3.6.3节“ 命名参数”): 命名参数遵循第4.4.1节中定义的标识符规则。命名参数的使

  • 我有以下序列