[英]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.