私は明示的な待機を使用しましたが、警告があります:
org.openqa.Selenium.WebDriverException:要素はポイント(36、72)でクリックできません。他の要素はクリックを受け取ります:...コマンドの継続時間またはタイムアウト:393ミリ秒
Thread.sleep(2000)
を使用した場合、警告は表示されません。
@Test(dataProvider = "menuData")
public void Main(String btnMenu, String TitleResultPage, String Text) throws InterruptedException {
WebDriverWait wait = new WebDriverWait(driver, 10);
driver.findElement(By.id("navigationPageButton")).click();
try {
wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(btnMenu)));
} catch (Exception e) {
System.out.println("Oh");
}
driver.findElement(By.cssSelector(btnMenu)).click();
Assert.assertEquals(driver.findElement(By.cssSelector(TitleResultPage)).getText(), Text);
}
これは典型的な org.openqa.Selenium.WebDriverException であり、これはJava.lang.RuntimeExceptionを拡張します。
この例外のフィールドは次のとおりです。
protected static final Java.lang.String BASE_SUPPORT_URL
public static final Java.lang.String DRIVER_INFO
public static final Java.lang.String SESSION_ID
個々のユースケースについて、エラーはそれをすべて伝えます:
WebDriverException: Element is not clickable at point (x, y). Other element would receive the click
wait
をWebDriverWait wait = new WebDriverWait(driver, 10);
として定義したことはコードブロックから明らかですが、ExplicitWait
がclick()
のように作用する前に、要素に対してuntil(ExpectedConditions.elementToBeClickable)
メソッドを呼び出しています。
エラーElement is not clickable at point (x, y)
は、さまざまな要因から発生する可能性があります。次のいずれかの手順でそれらに対処できます。
1。 JavaScriptまたはAJAX呼び出しが原因で要素がクリックされない
Actions
クラスを使用してみてください。
WebElement element = driver.findElement(By.id("navigationPageButton"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().build().perform();
2。要素が Viewport内にないためクリックされない
JavascriptExecutor
を使用して、ビューポート内に要素を持ってくるようにしてください:
WebElement myelement = driver.findElement(By.id("navigationPageButton"));
JavascriptExecutor jse2 = (JavascriptExecutor)driver;
jse2.executeScript("arguments[0].scrollIntoView()", myelement);
3。要素がクリック可能になる前にページが更新されます。
この場合、ポイント4で述べたように、ExplicitWait、つまりWebDriverWaitを誘導します。
4。要素はDOMに存在しますが、クリック可能ではありません。
この場合、クリック可能にする要素に対してExpectedConditions
をelementToBeClickable
に設定してExplicitWaitを誘導します。
WebDriverWait wait2 = new WebDriverWait(driver, 10);
wait2.until(ExpectedConditions.elementToBeClickable(By.id("navigationPageButton")));
5。要素は存在しますが、一時的なオーバーレイがあります。
この場合、ExplicitWait
とExpectedConditions
をinvisibilityOfElementLocated
オーバーレイを非表示にします。
WebDriverWait wait3 = new WebDriverWait(driver, 10);
wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));
6。要素は存在しますが、永続的なオーバーレイを持っています。
JavascriptExecutor
を使用して、要素のクリックを直接送信します。
WebElement ele = driver.findElement(By.xpath("element_xpath"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", ele);
Javascriptで使用する必要がある場合
Arguments [0] .click()を使用して、クリック操作をシミュレートできます。
var element = element(by.linkText('webdriverjs'));
browser.executeScript("arguments[0].click()",element);
ある要素(またはそのオーバーレイ、私は気にしませんでした)をクリックしようとしたときにこのエラーに遭遇し、他の答えは私にとってはうまくいきませんでした。 elementFromPoint
DOM APIを使用して修正し、代わりにSeleniumがクリックしてほしい要素を見つけました。
element_i_care_about = something()
loc = element_i_care_about.location
element_to_click = driver.execute_script(
"return document.elementFromPoint(arguments[0], arguments[1]);",
loc['x'],
loc['y'])
element_to_click.click()
また、要素がmovingであるという状況もありました。たとえば、ページ上でその上の要素がアニメーション化された展開または折りたたみを行っていたためです。その場合、このExpected Conditionクラスが役に立ちました。クリックする要素ではなく、アニメーション化される要素を指定します。このバージョンはjQueryアニメーションでのみ機能します。
class elements_not_to_be_animated(object):
def __init__(self, locator):
self.locator = locator
def __call__(self, driver):
try:
elements = EC._find_elements(driver, self.locator)
# :animated is an artificial jQuery selector for things that are
# currently animated by jQuery.
return driver.execute_script(
'return !jQuery(arguments[0]).filter(":animated").length;',
elements)
except StaleElementReferenceException:
return False
例外で言及されたポイントでページを近くまでスクロールすると、私にとってはうまくいきませんでした。以下はコードスニペットです。
$wd_Host = 'http://localhost:4444/wd/hub';
$capabilities =
[
\WebDriverCapabilityType::BROWSER_NAME => 'chrome',
\WebDriverCapabilityType::PROXY => [
'proxyType' => 'manual',
'httpProxy' => PROXY_DOMAIN.':'.PROXY_PORT,
'sslProxy' => PROXY_DOMAIN.':'.PROXY_PORT,
'noProxy' => PROXY_EXCEPTION // to run locally
],
];
$webDriver = \RemoteWebDriver::create($wd_Host, $capabilities, 250000, 250000);
...........
...........
// Wait for 3 seconds
$webDriver->wait(3);
// Scrolls the page vertically by 70 pixels
$webDriver->executeScript("window.scrollTo(0, 70);");
注:私は Facebook php webdriver を使用します
あなたが試すことができます
WebElement navigationPageButton = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("navigationPageButton")));
navigationPageButton.click();