【问题标题】:java selenium xpath relativejava selenium xpath 相对
【发布时间】:2020-10-05 16:57:19
【问题描述】:

我必须编写一个在 Allegro 上搜索轻型无人机的程序。 (使用 XPath 相对)

使用 Selenium Webdriver,在浏览器中打开 Allegro 门户,然后将产品类别切换到 Electronics 并在搜索字段中输入“Mavic mini”。

我为此使用了 Java 和 IntelliJ,当我访问网站时,我点击了警报,所以它关闭了,我将“Elektronika”放入了类别字段。我无法编写应该输入“mavic mini”的那部分代码,这就是它的样子;

    import org.openqa.selenium.Alert; 
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver; 
    import org.openqa.selenium.WebElement; 
    import org.openqa.selenium.chrome.ChromeDriver; 
    import org.openqa.selenium.support.ui.Select; 
    import org.openqa.selenium.support.ui.WebDriverWait;


    public class AllegroTestingApp {
         public static void main(String[] args) {

         System.setProperty("webdriver.chrome.driver", "c:\\selenium-drivers\\chrome\\chromedriver.exe");
         WebDriver driver = new ChromeDriver();
         driver.get("https://www.allegro.pl");
 
         WebElement categoryCombo = driver.findElement(By.xpath("//div//div//select"));
         Select categorySelect = new Select(categoryCombo);
         categorySelect.selectByIndex(3);
         driver.manage().window().maximize();
         driver.findElement(By.xpath("/html/body/div[2]
        /div[8]/div/div[2]/div/div[2]/button[2]")).click();
        Alert simpleAlert = driver.switchTo().alert();
        simpleAlert.accept();    
        WebElement inputField = 
        driver.findElement(By.xpath("//INPUT[@type='search']/self::INPUT"));
        inputField.sendKeys("mavic mini");
        inputField.submit();
 } 

请帮忙!

【问题讨论】:

  • 请添加这部分代码所针对的网站的 html 代码。 By.xpath("//INPUT[@type='search']/self::INPUT")
  • 它不起作用
  • 请花一点时间正确格式化您的所有代码。现在它都被列为引号,然后一些被标记为代码,而其他代码则不是。缩进不一致,所有多余的空行使其更难阅读。

标签: java selenium xpath


【解决方案1】:

我看到有问题的代码只是通过在下面的行注释来工作。该页面中似乎不再有警报。

Alert simpleAlert = driver.switchTo().alert();
simpleAlert.accept(); 

【讨论】:

    【解决方案2】:

    一些反馈项:

    1. categoryCombo 的定位器非常广泛/通用,应尽可能具体。始终查找页面上唯一的 ID、名称或其他一些属性。在这种情况下,它有一个唯一的aria-label,我们可以使用它来制作一个唯一的定位器By.cssSelector("select[aria-label='Kategoria i opcje wyszukiwania']")

    2. 您应该选择发送您正在寻找的实际值,而不是按索引选择,例如“电子”。这使得它更具可读性,如果类别发生变化(这会改变索引),您的代码仍然可以工作。为此,您可以使用Select.selectByVisibleText()

    3. 你的代码的下一部分我不明白。您正在单击一个按钮,然后接受一个 JS 警报?我没有看到,所以我不确定您在那里看到了什么,或者您是否在设置下拉菜单之前尝试接受/关闭初始弹出窗口?如果是这样,您的代码有问题。

    4. 您的搜索框定位器正在工作,但并不具体,并且有一些不相关的部分,例如“.../self::INPUT”部分不是必需的。与我的第一点一样,您希望使用 ID、名称等使您的定位器尽可能具体。在这种情况下,搜索框有一个名称,所以我使用了它,By.cssSelector("input[name='string']")

    5. 大多数时候,在网站上搜索一个项目的人最终希望搜索另一个项目。在这种情况下,最好将您的搜索相关代码打包成一个方法。我创建了SelectCategory(),它接受一个类别的名称并设置它。我还创建了Search(),它接受类别名称和搜索字符串并进行完整搜索。您可以在下面的代码中看到它们。

    6. 因为我将一些代码移到了不同​​的方法中,所以我将驱动程序实例变量移到了类的顶部,这样您就不必将它传递给每个方法。

    这是我的工作代码:

    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.support.ui.ExpectedConditions;
    import org.openqa.selenium.support.ui.Select;
    import org.openqa.selenium.support.ui.WebDriverWait;
    
    public class AllegroTestingApp
    {    
        static WebDriver driver;
    
        public static void main(String[] args)
        {
            System.setProperty("webdriver.chrome.driver", "c:\\selenium-drivers\\chrome\\chromedriver.exe");
            driver = new ChromeDriver();
            driver.manage().window().maximize();
    
            String url = "https://www.allegro.pl";
            driver.get(url);
    
            // wait for popup and close
            new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.cssSelector("img[alt='zamknij']"))).click();
    
            Search("Elektronika", "mavic mini");
    
            driver.quit();
        }
    
        public static void Search(String categoryName, String searchString)
        {
            SelectCategory(categoryName);
            WebElement searchBox = driver.findElement(By.cssSelector("input[name='string']"));
            searchBox.sendKeys(searchString);
            searchBox.submit();
        }
    
        public static void SelectCategory(String categoryName)
        {
            By categoryDropdownLocator = By.cssSelector("select[aria-label='Kategoria i opcje wyszukiwania']");
            new Select(driver.findElement(categoryDropdownLocator)).selectByVisibleText(categoryName);
        }
    }
    

    【讨论】:

      【解决方案3】:

      试试这个代码,它会工作:

      driver.get("https://www.allegro.pl");
              WebElement categoryCombo = driver.findElement(By.xpath("//div//div//select"));
              Select categorySelect = new Select(categoryCombo);
              categorySelect.selectByIndex(3);
              driver.manage().window().maximize();
              driver.findElement(By.xpath("/html/body/div[2]/div[8]/div/div[2]/div/div[2]/button[2]")).click(); 
             WebElement inputField =driver.findElement(By.xpath("//input[@name='string']"));
             inputField.sendKeys("mavic mini");
             inputField.submit();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多