Selenium webdriver xpath随机无法识别

时间:2017-08-07 13:48:18

标签: java selenium xpath selenium-webdriver webdriver

当运行代码时,Aprobă按钮的XPath无法识别并且无法点击它,即使我检查网站上的元素时XPath似乎找到了正确的按钮。

错误是:

  

org.openqa.selenium.NoSuchElementException:没有这样的元素:无法找到元素{"方法":" xpath","选择器":&#34 ; // a [contains(。,'')] / ancestor :: div [contains(@class,' js-answer-element')] // span [@class =' SG-图标-AS-button__hole']"}

我的方法approveAnswerByUsername(String username)应检查答案是否已获批准。通过用户名附近的3个按钮和其下方的绿色圆圈识别已批准的答案。 用户可以是第一个回答,第二个或唯一一个。这就是我使用" ancestor"在XPath中。

在某些情况下,圈子已经被看到(即使在先例的情况下),而在其他情况下则没有。按钮"Aprobă"也一样。

以下代码应执行以下操作: 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 个答案:

答案 0 :(得分:0)

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

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

ID选择器是选择元素的最佳和最快的方式。 Xpath较慢,有时不可靠。

我的建议是尝试ID和名称选择器,并且只有在找不到两者时才使用xpath。