【问题标题】:Click not going through but says it is Selenium js点击不通过,但说它是 Selenium js
【发布时间】:2021-11-19 10:27:10
【问题描述】:

使用 Selenium,我正在填写一个表单,单击一个按钮将我带到同一选项卡上的一个新页面,然后我希望能够单击新页面中的一个按钮。 但是我得到了

没有这样的元素:无法找到元素:{"method":"css 选择器","选择器":"*[id="widget_5052246"]"}

我发现它并没有等待我的页面完全加载,然后再尝试单击下一步按钮。 于是我环顾四周,发现this。 添加了

driver.wait(function() {
  return driver.executeScript('return document.readyState').then(function(readyState) {
    return readyState === 'complete';
  });
}); 

但是,它没有用......

发现我可以做到

await driver.wait(until.elementLocated(By.id("widget_5052246")), 20000)

然后点击元素后。

但我得到了

Error: Timeout of 30000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.

是的,我不确定如何等待页面正确加载...

按钮的HTML代码:

<button id="widget_5052246" class="adbx-widget btn btn-default" data-action="play" ng-style="vm.style" ng-click="vm.click($event);" ng-mouseover="vm.onMouseOver()" ng-mouseleave="vm.onMouseLeave()" ng-mousedown="vm.onMouseDown()" ng-mouseup="vm.onMouseUp()" ng-touchstart="vm.onTouchStart()" ng-touchend="vm.onTouchEnd()" ng-hide="vm.hide" identifier="5052246" aria-hidden="false" style="visibility: visible; width: auto; height: auto; left: 260px; top: 253px; z-index: 1; transform: rotate(0deg); cursor: pointer; outline: none;"><!-- ngIf: vm.styleClass === '' --> <!-- ngIf: vm.styleClass !== '' --><span ng-if="vm.styleClass !== ''" disabled="disabled" style="opacity: 1; cursor: pointer" translate="Cliquez pour découvrir si vous avez gagné" class="ng-scope ng-binding">Cliquez pour découvrir si vous avez gagné</span><!-- end ngIf: vm.styleClass !== '' --></button>

发现问题不在于加载时间没有发生,而是点击没有通过。该点击通常会打开一个新页面,但它永远不会进入下一页。

编辑:添加按钮代码

【问题讨论】:

  • 这个idwidget_5052246好像不是静态的,可以分享一下这个按钮的HTML代码吗?
  • 你不应该等待readyState === 'complete'。默认开启。
  • @cruisepandey 我添加了按钮的代码。
  • @Joel :我不理解不接受,这张票仅用于定位器和点击问题,我们解决了它,请参阅下面的 cmets,之后您无法执行点击的地方,如果您要求有变化,请尝试提交新工单。

标签: javascript selenium selenium-webdriver


【解决方案1】:

基于OP分享的HTML,我构造了这个xpath

//button[starts-with(@id,'widget') and starts-with(@class,'adbx-widget') and @identifier]

首先你应该检查我们在HTMLDOM中是否有唯一的匹配节点。

PS:如果我们在HTML DOM 中有唯一条目,请检查dev tools(谷歌浏览器)。

检查步骤:

Press F12 in Chrome -> 转到element 部分 -> 做一个CTRL + F -> 然后粘贴xpath 看看,如果你想要的element 用@ 得到突出显示 987654333@匹配节点。

如果我们有唯一的条目,我们可以继续如何点击此元素

let ele = await driver.wait(until.elementLocated(By.xpath("//button[starts-with(@id,'widget') and starts-with(@class,'adbx-widget') and @identifier]")),10000);
ele.click();

有关显式等待的更多信息,请参阅here

更新:

在 python 中,我会有这个脚本:

driver = webdriver.Chrome(driver_path)
driver.maximize_window()
driver.implicitly_wait(30)
wait = WebDriverWait(driver, 30)
driver.get("https://adbx.io/click-win-gujx1tfvdf/0/o4R2a/")

wait.until(EC.element_to_be_clickable((By.ID, "cookies-banner-confirmation-button"))).click()  #to click on Accepter button.
wait.until(EC.element_to_be_clickable((By.ID, "lastname"))).send_keys('fakelastname') # to send Nom*
wait.until(EC.element_to_be_clickable((By.ID, "firstname"))).send_keys('fakeFirstName') # to send Prenom*
wait.until(EC.element_to_be_clickable((By.ID, "email"))).send_keys('fakeEmail@hotmail.com') # to send Email*
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.md-container.md-ink-ripple"))).click()  # to click the J'accepte le règlement*

wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[ng-click='vm.click($event);']"))).click()  # to click on Valider

wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@data-action]"))).click()  # to click on Cliquez pour découvrir si vous avez gagné

ele = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div[ng-bind-html='vm.text']")))
print(ele.text)

【讨论】:

  • (//button[starts-with(@id,'widget') and starts-with(@class,'adbx-widget') and @identifier])[1] 可能是这样的 xpath 索引,您可以将 [1] 更改为 [2] 等等.. 但请确保您在 HTMLDOM 中具有唯一的匹配节点,即 1 /1
  • 对于这个特殊的问题,它运行良好......点击后,我必须再次点击,我使用了类似的代码,唯一的事情是我修改了 xpath,所以它可以找到点击的地方在。我又遇到超时错误?
  • @Joel :我需要查看 HTML 以进一步指导您。
  • 这里是website。输入假名,姓氏,电子邮件。我可以单击第一个提交按钮,您将看到的第二个按钮是我们在问题中针对的那个按钮,接下来是一个“结果”页面,我在其中单击“Bravo ...”(稍后将断言)。需要在每次重新加载时删除 cookie 并使用不同的电子邮件地址
  • 我确实按照你上面提到的所有步骤,点击//button[starts-with(@id,'widget') and starts-with(@class,'adbx-widget') and @identifier]后,我得到了这个作为外层HTML
猜你喜欢
  • 2017-05-31
  • 2015-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 2017-02-26
  • 2016-01-31
  • 1970-01-01
相关资源
最近更新 更多