Автоматизация Span с помощью Selenium и Java 13 - PullRequest
1 голос
/ 23 сентября 2019

Я автоматизирую веб-сайт с использованием селена в Java.

<a id="pd-vote-button10359300" class="css-vote-button pds-vote-button"><span>Vote</span></a>

Для этой кнопки мне нужно автоматизировать Click in Selenium.Я делаю, следуя, но не работаю.

WebElement click = driver.findElement(By.id("pd-vote-button10359300"));
JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].click();", click);

Не могли бы вы подсказать, в чем проблема?

После

new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//a[@class='css-vote-button pds-vote-button' and starts-with(@id, 'pd-vote-button')]/span[text()='Vote']"))).click();

Я получил сообщение об ошибке

Exception in thread "main" org.openqa.selenium.ElementClickInterceptedException: element click intercepted: Element <span>...</span> is not clickable at point (122, 877). Other element would receive the click: <div class="nc_wrapper swp_floating_horizontal_wrapper bottom" style="background-color: rgb(255, 255, 255);">...</div>
 (Session info: chrome=77.0.3865.90)
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:25:48'
System info: host: 'Sanjeevans-iMac.local', ip: '169.254.10.5', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.14.6', java.version: '13'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 77.0.3865.90, chrome: {chromedriverVersion: 76.0.3809.126 (d80a294506b4..., userDataDir: /var/folders/k2/8cltlrwj23n...}, goog:chromeOptions: {debuggerAddress: localhost:59693}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: MAC, platformName: MAC, proxy: Proxy(), setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify}
Session ID: 02cb57fb86be956e5e10be634b5724b1

    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)

    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)

    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)

    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187)

    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122)

    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49)

    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)

    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)

    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)

    at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:285)

    at org.openqa.selenium.remote.RemoteWebElement.click(RemoteWebElement.java:84)

    at bigboss.A.main(A.java:49)

Ответы [ 4 ]

1 голос
/ 23 сентября 2019

Вы получаете ошибку ElementClickInterceptedException, что означает, что какой-то другой элемент на странице перекрывает элемент, на который вы пытаетесь щелкнуть.Вам нужно будет как-то взаимодействовать со страницей, чтобы перекрывающийся элемент больше не перекрывался, или использовать JavaScript, чтобы одновременно щелкнуть по элементу и вызвать событие «щелчка».

Многие веб-сайты имеют элементы навигации по страницам, которыепрокрутите вместе с пользователем, чтобы что-то вроде плавающего заголовка навигации могло мешать элементу, по которому вы хотите щелкнуть.У DebanjanB есть хорошее решение в качестве следующего шага для устранения этой проблемы, но я подозреваю, что вы получите TimeoutException, ожидая, когда элемент будет активен.

Скорее всего, вам нужно будет посмотреть, как этот автоматический тест выполняется, а затемпоиграйте со страницей после провала теста, прежде чем узнаете, как это исправить.

1 голос
/ 23 сентября 2019

К click() на элементе, который вы должны вызвать WebDriverWait для elementToBeClickable(), и вы можете использовать любую из следующих Стратегий локатора :

  • cssSelector:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("a.css-vote-button.pds-vote-button[id^='pd-vote-button']>span"))).click();
    
  • xpath:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//a[@class='css-vote-button pds-vote-button' and starts-with(@id, 'pd-vote-button')]/span[text()='Vote']"))).click();
    

Обновление

В качестве альтернативы вы можете использовать метод executeScript() следующим образом:

  • cssSelector:

    ((JavascriptExecutor) driver).executeScript("arguments[0].click();", new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("a.css-vote-button.pds-vote-button[id^='pd-vote-button']>span"))));
    
  • xpath:

    ((JavascriptExecutor) driver).executeScript("arguments[0].click();", new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//a[@class='css-vote-button pds-vote-button' and starts-with(@id, 'pd-vote-button')]/span[text()='Vote']"))));
    

Примечание : Поскольку вы используете java.version: '13', стоит упомянуть, что существуют некоторые проблемы совместимости между Selenium и / , и вы можете найти подробные обсуждения в:


tl; др

0 голосов
/ 23 сентября 2019

Возможно, ваш идентификатор меняется. Попробуйте ниже xpath.

//a[@class='css-vote-button pds-vote-button']/span[text()='Vote']

Код:

WebElement click = driver.findElement(By.xpath("//a[@class='css-vote-button pds-vote-button']/span[text()='Vote']"));
JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].click();", click);
0 голосов
/ 23 сентября 2019

Почему бы вам не сделать следующее, чтобы нажать?

WebElement click = driver.findElement(By.id("pd-vote-button10359300"));
click.click()
...