[英]java selenium xpath relative
我必须编写一个程序来在 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();
}
请帮忙!
我看到有问题的代码正在通过评论下面的行来工作。 该页面中似乎不再有警报。
Alert simpleAlert = driver.switchTo().alert();
simpleAlert.accept();
几个反馈项目:
您的categoryCombo
定位器非常广泛/通用,应尽可能具体。 始终查找页面上唯一的 ID、名称或其他一些属性。 在这种情况下,它有一个唯一的aria-label
,我们可以用它来制作唯一的定位器By.cssSelector("select[aria-label='Kategoria i opcje wyszukiwania']")
不是按索引选择,您应该选择发送您正在寻找的实际值,例如“Elektronika”。 这使得它更具可读性,如果类别发生变化(这会改变索引),您的代码仍然可以工作。 为此,您可以使用Select.selectByVisibleText()
。
你代码的下一部分我不明白。 您正在单击按钮然后接受 JS 警报? 我没有看到,所以我不确定你在那里看到了什么,或者你是否在设置下拉菜单之前尝试接受/关闭初始弹出窗口? 如果是这样,则您的代码有问题。
您的搜索框定位器正在工作,但不是特定的,并且有一些不相关的部分,例如“.../self::INPUT”部分不是必需的。 正如我的第一点,您希望使用 ID、名称等使您的定位器尽可能具体。在这种情况下,搜索框有一个名称,所以我使用它By.cssSelector("input[name='string']")
。
大多数情况下,在网站上搜索一项的人最终希望搜索另一项。 在这种情况下,最好将与搜索相关的代码打包成一个方法。 我创建了SelectCategory()
,它接受一个类别的名称并设置它。 我还创建了Search()
,它接受类别名称和搜索字符串并进行完整搜索。 您可以在下面的代码中看到它们。
因为我将一些代码移到了不同的方法中,所以我将驱动程序实例变量移到了类的顶部,这样您就不必将其传递到每个方法中。
这是我的工作代码:
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);
}
}
试试这个代码它会起作用:
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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.