当前位置: 首页 > 知识库问答 >
问题:

单击使用Selenium的伪元素

唐弘厚
2023-03-14

我试图使用Selenium来单击::after伪元素。我意识到这无法通过WebDriver直接实现,但似乎无法找到一种使用Javascript实现的方法。

下面是DOM的外观:

<em class="x-btn-split" unselectable="on" id="ext-gen161">
    <button type="button" id="ext-gen33" class=" x-btn-text">
        <div class="mruIcon"></div>
        <span>Accounts</span>
    </button>
    ::after
</em>

上面的元素是这样的。对象的左边是按钮元素,后面的:元素是右边,箭头在单击时会下拉框。正如你所看到的,右边没有任何标识符,这就是为什么很难做到这一点的部分原因。

我在stackoverflow中看到了这两个链接,并试图将答案结合起来形成我的解决方案,但没有效果。

使用JavaScript在Selenium WebDriver中单击元素
使用JavaScript在Selenium WebDriver中定位伪元素

以下是我的一个尝试:

string script = "return window.getComputedStyle(document.querySelector('#ext-gen33'),':before')";
IJavaScriptExecutor js = (IJavaScriptExecutor) Session.Driver;
js.ExecuteScript("arguments[0].click(); ", script);

其中我得到了一个错误:

System.InvalidOperationException: 'unknown error: arguments[0].click is not a function
  (Session info: chrome=59.0.3071.115)
  (Driver info: chromedriver=2.30.477700 (0057494ad8732195794a7b32078424f92a5fce41),platform=Windows NT 6.1.7601 SP1 x86_64)'

我还尝试使用Selenium中的Actions类将鼠标移动到左手边,类似于这个答案。我认为这可能是因为我不知道偏移量是用什么来测量的,而且文档似乎没有给出任何指示。我认为它是以像素为单位的??

Actions build = new Actions(Session.Driver);
build.MoveToElement(FindElement(By.Id("ext-gen33"))).MoveByOffset(235, 15).Click().Build().Perform();

这个尝试似乎点击了某个地方,因为它没有给出错误,但我不确定在哪里。

如果有帮助的话,我正在尝试用c#实现Salesforce(服务云)的自动化。

也许有人能提供解决方案

共有3个答案

屠德宇
2023-03-14

上面的Maciej'a答案适用于WebDriver,但不适用于针对Firefox V.56的RemoteWebDriver(Selenium 3.12.0)。我们需要一个同时适用于本地和远程的解决方案。最后使用键盘快捷键调用导航菜单下拉菜单。作为一个额外的好处,这也消除了使用补偿的需要。

String navigationMenuDropdownShortcutKeys = Keys.chord(Keys.ESCAPE, "v");

new Actions(driver)
 .sendKeys(navigationMenuDropdownShortcutKeys)
 .perform();
卢翔宇
2023-03-14

对于那些试图在Python中做到这一点的人,解决方案如下:

<代码>elem=驱动程序。

基本上在这里,我在DOM中找到我的元素,并分配给一个WebElement。然后向WebElement传递方法move_to_element_,并将_offset作为参数。

我从开发者工具中得到了元素的px值。

PS:使用此导入-来自selenium。网络驱动程序。常见的动作链导入动作链

您可以在这里阅读更多关于Action chain类及其方法move_to_element_with_offset:http://selenium-python.readthedocs.io/api.html.

希望这有帮助。

连德水
2023-03-14

我在为Salesforce编写Selenium测试时遇到了同样的问题,并通过使用操作直接控制鼠标来解决了这个问题。

这个按钮的包装表硬编码宽度为250px,您已经发现了。要定位鼠标的位置,可以使用contextClick()方法,而不是Click() 它模拟鼠标右键,因此它将始终打开浏览器菜单。

如果你这样做:

Actions build = new Actions(Session.Driver);
build.MoveToElement(FindElement(By.Id("ext-gen33"))).ContextClick().Build().Perform();

你会发现鼠标移动到WebElement的中间,而不是左上角(我想也是这样)。因为元素宽度是恒定的,所以我们可以通过向右移动鼠标,它就会工作:)代码:

Actions build = new Actions(Session.Driver);
build.MoveToElement(FindElement(By.Id("ext-gen33"))).MoveByOffset(124, 0).Click().Build().Perform();

 类似资料:
  • 问题内容: 我想知道如何启用对伪元素的单击(我链接到下面的JSfiddle上div的橙色部分)。我读过,由于伪元素不在DOM中,因此您需要对此进行破解。不幸的是,我找不到实际显示有效代码的现有Stackoverflow问答。 HTML: CSS: 问题答案: 一种解决方法是将a动态添加到该项目并为其分配click方法。 CSS

  • 我正试图点击一个硒元素。它是一个复选框,包含以下HTML代码: 包含复选框和术语的段落代码: 我尝试过三种不同的方法,但都不奏效: 请帮助解决其他问题。

  • 如何使用selenium Python从主机A(在本例中为jsfiddle.net)单击此处的红色按钮?(java脚本限制策略错误,不让我去做)。我也不想直接点击红色按钮。谢了。

  • 我搞不懂这个。 我在这个网站上工作,我使用Python中的selenium来单击类名“yellow showPopupUnder”下的第一个元素(屏幕的主要部分有20行关于房屋的黄色信息)。 当我让Selenium点击该行后,它会打开并显示更多信息。我对有“选中”和“未选中”框的部分感兴趣。这些复选框位于这样的div中: 未选中的框位于一个div中,如下所示: 我试着用几种方法联系他们: 我还尝试

  • 我有一个带有几个圆形和矩形元素的SVG对象。使用webdriver,我可以单击主svg对象,但不能单击其中的任何元素。问题似乎只出在点击(或任何鼠标交互)上,因为我可以使用getAttribute()返回宽度、ID、x/y、text等值,用于它下面的任何内容。 下面是HTML的一个示例: 以及WebDriver试图右键单击矩形元素(失败)的示例: 但这会起作用,并返回一个值: 当WebDriver

  • 我试图点击一个按钮,它出现在图的右侧(图上方的三行),最后想点击“下载为CSV”。我的代码如下。 File=WebDriverWait(驱动程序,20).until(ec.element_to_be_clickable((by.xpath,'//*[@id=“HighCharts-3SLSA4F-0”]/div[2]/ul/li[6]')).click()#下载为csv 错误:引发TimeoutE