Selenium WebDriver中的点击命令无效。

53

我最近刚刚将我的Selenium IDE代码导出到Selenium WebDriver。我发现在IDE中能够正常工作的许多命令在WebDriver中要么无法正常工作,要么根本不支持。迄今为止,我一直在逐个解决这些问题,这显然不是一个理想的方法...

目前,我正在研究为什么在WebDriver中单击按钮不起作用,而它以前在Selenium IDE中可以正常工作。我的浏览器是FF 13,操作系统是Ubuntu。

代码片段

WebElement loginButton = driver.findElement(By.name("submit"));
loginButton.click();

我之前尝试过

driver.findElement(By.name("submit")).click();

然而,上述代码行也失败了。元素被选择了,但是它没有像我想的那样将我们登录。我找到了其他一些类似问题的页面,但他们的问题似乎是与Internet Explorer而非Firefox有关。我甚至不想去考虑IE今后会给我带来什么问题。

谢谢,

P.S. 提供一种更好的方法从Selenium IDE迁移到Selenium Webdriver而不会丢失所有编写的测试,可能也能解决这个问题。


你尝试过使用 assert loginButton.isDisplayed(); 吗? - Franz Ebner
2
当您说click()操作失败时,是否出现任何错误或异常?请发布它们以了解为什么click()操作失败。 - Hari Reddy
10个回答

104
如果您确定元素存在,您可以尝试以下方法模拟点击 - 如果 .Click() 不起作用。
driver.findElement(By.name("submit")).sendKeys(Keys.RETURN);

或者

driver.findElement(By.name("submit")).sendKeys(Keys.ENTER);

1
@PavelJanicek 任何一个都可以解决问题,但编辑后显示两个 ;) - TheLifeOfSteve
4
哇,我不知道这个。点赞因为你教了我一些新东西 :) - Pavel Janicek
1
这些命令对我有用。尽管最终发现我的问题与CAS身份验证有关。感谢您的答案! - OrwellHindenberg
2
@TheLifeOfSteve 喜欢它!甚至可以为屏幕范围之外的元素执行此操作! - IamBatman
1
@TheLifeOfSteve - Enter、Return、Space、JavaScript Executor、Actions - 这些对我都不起作用。如果在点击之前加上一个小的等待时间,它就能正常工作。元素似乎并没有被禁用。所以,我不知道为什么需要等待。 - MasterJoe
显示剩余2条评论

10

需要注意的主要事项是按钮是否启用。您仍然可以点击它们,没有任何东西会倒塌,元素也在那里,但它尚未准备好被点击,因此不会有任何操作。

我一直在使用webdriver,花了我大部分时间才弄清楚这一点!

以下方法似乎可靠地工作(至少对于一个按钮在我的环境中)

    private void TryClick(By selector)
    {
        var wait = WaitUpTo(TimeSpan.FromSeconds(10));
        var element = wait.Until(ExpectedConditions.ElementIsVisible((selector)));

        //really important bit!
        WaitUpTo(TimeSpan.FromSeconds(5))
            .Until(d => element.Enabled);

        element.Click();
    }

你可以像这样使用它

TryClick(By.XPath("//button[contains(.//*,'Some Text')]"));

7

WebElement.click() 函数在页面放大或缩小后会出现无法使用的情况。

我将页面缩小至85%。

如果您使用浏览器进行ctrl++ctrl+-来重置页面缩放比例至100%,那么点击功能将会可以正常使用。

此问题发生在Chrome版本86.0.4240.111中。


4

2

你的代码两个版本都没有问题。导致这个问题的原因,不是代码本身。

你有三重检查定位器吗?你的元素确定是name=submit而不是id=submit吗?


2
感谢大家提供的所有答案!我已经找到了解决方法,原来是我在问题中没有提供足够的代码。
问题并不在于click()函数,而是与我的项目中使用的CAS认证相关。在Selenium IDE中,我的登录测试执行了一个“打开”命令,指向以下位置:
/cas/login?service=https%1F%8FAPPNAME%2FMOREURL%2Fj_spring_cas_security

操作成功。我将测试导出到Selenium webdriver中,该操作自然地保留了该位置。在Selenium Webdriver中使用的命令是:

driver.get(baseUrl + "/cas/login?service=https%1A%2F%8FAPPNAME%2FMOREURL%2Fj_spring_cas_security");

出于我尚未理解的原因,上述方法失败了。当我将其更改为以下方式时:

driver.get(baseUrl + "MOREURL/");

点击命令突然开始工作了...如果我能弄清楚原因,我会编辑这个答案。

注意:我模糊了上面使用的URL以保护我的公司产品。


你说它在IE上失败了,而在Firefox上没有。你确定这种情况只是由于位置引起的吗? - Nick Dong
请编辑原始问题,而不是将更新发布为答案。 - Martin Geisler

2

我曾经使用火狐浏览器,但出现了点击无效的问题,尽管之前两个月一直正常。我想到使用sendKeys方法并通过这个页面解决了问题。现在我使用的是sendKeys(Keys.Enter)。


3
这是一条评论,不是答案。为什么它被投票赞同了? - IamBatman

1
我正在使用EasyRepro进行工作,当我调试代码时,它会点击可见且启用的元素,但不会按预期导航。但最终我理解了问题的根本原因。
我的Chrome浏览器缩小了90%。
一旦我重置了缩放级别,它就会点击正确的元素并成功导航到下一页。

1

这是chromedriver存在已久的问题(2020年仍然存在)。点击此处

在Chrome中,我将缩放比例从90%更改为100%,问题得到解决。参考链接

我认为TheLifeOfSteve的答案更可靠。


0
我使用如下的函数使其工作,或者至少尝试几次。基本上,检查 current_url 直到获得新页面。
def make_button_work(driver, path, max_try = 3):
strUrl_1 = driver.current_url
strUrl_2 = driver.current_url
try_num = 0
while strUrl_1 == strUrl_2:
    try_num +=1
    button = driver.find_element_by_xpath(path)
    time.sleep(1)
    button.click()
    time.sleep(1)
    strUrl_2 = driver.current_url
    if max_try == try_num:
        print('Reached max_try')
        break

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接