Selenium WebDriverを使用してテストを自動化する方法を学んでいますが、行き詰まり、Firefoxでドロップダウンメニューを機能させることができません。同じコードがChromeで完全に正常に実行されます。
私が実践しているサイトは http://www.executeautomation.com/demosite/index.html で、メニューから次の項目をクリックしたい:Automation Tools> Selenium> Selenium WebDriver。
エラーメッセージは、web要素がまだ画面に読み込まれていない可能性があることを示唆しているため、要素が表示されるまで実行ごとに待機するメソッドを実装しました。
public static void ImplicitWait(WebDriver driver){
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
}
しかしそれは助けにはならなかった。
次に、それらのmoveToElement()メソッドを1つずつ実行するのではなく、「パイプ」する方が適切であると読みました。だから私はこれを変更しました:
action.moveToElement(menu).perform();
action.moveToElement(Selenium).perform();
action.moveToElement(seleniumWebDriver).click().build().perform();
1行に。この時点で、Chromeで動作するようになりましたが、Firefoxで動作させるにはまだ苦労しています。
現在のコードは次のようになります。
System.setProperty("webdriver.gecko.driver", "C:\\Drivers\\geckodriver-v0.24.0-win64\\geckodriver.exe");
System.setProperty("webdriver.firefox.bin", "C:\\Program Files\\Mozilla Firefox\\firefox.exe");
WebDriver driver = new FirefoxDriver();
ImplicitWait(driver);
driver.navigate().to("http://executeautomation.com/demosite/index.html");
WebElement menu = driver.findElement(By.id("Automation Tools"));
WebElement Selenium = driver.findElement(By.id("Selenium"));
WebElement seleniumWebDriver = driver.findElement(By.id("Selenium WebDriver"));
Actions action = new Actions(driver);
action.moveToElement(menu).moveToElement(Selenium).moveToElement(seleniumWebDriver).click().build().perform();
上記で述べたように、Chromeに切り替えても同じように機能しますが、Firefoxではエラーメッセージが表示されます。
Exception in thread "main" org.openqa.Selenium.interactions.MoveTargetOutOfBoundsException: (-9862, 206) is out of bounds of viewport width (1283) and height (699)
私が使用しています:* Firefox v66.0.2 * Java v1.8.0_201 * Selenium Java v3.141.59 * GeckoDriver v0.24.0
助けてください。
geckodriver
およびActions
クラスで同じ問題が発生しました。あなたは次のコードで行くことができますが
System.setProperty("webdriver.gecko.driver", "C:\\Drivers\\geckodriver-v0.24.0-win64\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();
driver.get("http://executeautomation.com/demosite/index.html");
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
WebElement mainmenu = driver.findElement(By.xpath("//li[@class='active has-sub']"));
WebElement submenu = driver.findElement(By.xpath("//li[@class='has-sub'] [contains(.,'Selenium')]"));
WebElement intendedLink = driver.findElement(By.xpath("//li[@class='has-sub'] [contains(.,'Selenium')]//li[contains(.,'Selenium WebDriver')]"));
Actions action =new Actions(driver);
action.moveToElement(mainmenu).clickAndHold().build().perform();
Thread.sleep(1000);
action.moveToElement(submenu).clickAndHold().build().perform();
Thread.sleep(1000);
intendedLink.click();
コードは私の側でうまく機能しています。問題があれば教えてください。
注:マウスポインターをWebページ画面に近づけないでください。そうしないと、現在のフォーカスが上書きされます。
以下のコードを試してください(フレーム内にいる場合は、以下のコードを使用する必要があります):
WebDriver driver=new ChromeDriver();
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.scrollBy(0,400)");
それを使ってみてください-
action.moveToElement(menu).build().perform();
Thread.sleep(500);
moveToElement(Selenium).build().perform();
Thread.sleep(500);
moveToElement(seleniumWebDriver).click().build().perform();
WebDriverWait
を使用して、次のコードを試してください。
driver.get("http://executeautomation.com/demosite/index.html");
WebDriverWait wait = new WebDriverWait(driver, 20);
WebElement menu= wait.until(ExpectedConditions.elementToBeClickable(By.id("Automation Tools")));
Actions action = new Actions(driver);
action.moveToElement(menu).build().perform();
WebElement Selenium =wait.until(ExpectedConditions.elementToBeClickable(By.id("Selenium")));
action.moveToElement(Selenium).build().perform();
WebElement seleniumWebDriver =wait.until(ExpectedConditions.elementToBeClickable(By.id("Selenium WebDriver")));
action.moveToElement(seleniumWebDriver).click().build().perform();