【问题标题】:Selenium: sendKeys()硒:sendKeys()
【发布时间】:2017-03-28 21:03:39
【问题描述】:

我尝试使用 Java + Selenium 自动登录到我的 Gmail 帐户,但每次都被 Google 阻止。当我手动登录时(即使在同一台服务器上),我也没有这样的问题。此外,如果我使用 "sendKeys" 类型库 (https://pypi.python.org/pypi/SendKeys/0.3) 我没有这样的问题。

我的问题有两个:

  1. Selenium “发送密钥”的方式与普通用户的方式之间有哪些技术差异?或者 Python 库是怎么做的?

  2. 有没有办法修改 selenium 使其模仿真实用户?或者是否有其他库可以代替 Selenium 来模拟真实用户?

谢谢

【问题讨论】:

  • 分享您为登录 gmail 而编写的代码。它应该工作..
  • 你检查过这个For Gmail login

标签: java python selenium


【解决方案1】:

实际上是速度的差异。人类打字慢,脚本写得非常快。因此,您必须降低脚本速度。所以总的来说你必须建立更好的机器人。 任何服务器都不会检测到更好的机器人。

【讨论】:

    【解决方案2】:

    你应该在你的代码中加入一些延迟来欺骗谷歌你的代码是真正的人类 - 就是这样:) Thread.sleep 可能是这里最简单的解决方案。

    【讨论】:

      【解决方案3】:

      打开 gmail 并登录并打开最近收到的邮件

      DriverObj.get("http://www.gmail.com");
                      DriverObj.findElement(By.id("gmail-sign-in")).click();
                      DriverObj.findElement(By.id("Email")).sendKeys("youremailID");
                      DriverObj.findElement(By.id("next")).click();
                      DriverObj.findElement(By.id("Passwd")).sendKeys("yourpassword");
                      DriverObj.findElement(By.id("signIn")).click();
                      Thread.sleep(2000);
                  WebElement tableelement=DriverObj.findElement(By.xpath("//div[@class='Cp']/div/table//tbody"));
                  java.util.List<WebElement> tableelement1=tableelement.findElements(By.xpath("//div[@class='Cp']/div/table//tbody/tr"));
                  int tableelementsize=tableelement1.size();
                  int i;
                  if(tableelementsize>0){
                      //DriverObj.navigate().refresh();
                      for(i=0;i<tableelementsize;i++){
                          DriverObj.findElement(By.xpath("//div[@class='Cp']/div/table//tbody/tr/td[6]")).click();
                      }
      
                  }else {
                       if(tableelementsize==0){
                          DriverObj.navigate().refresh();
                          for(i=0;i<tableelementsize;i++){
                              DriverObj.findElement(By.xpath("//div[@class='Cp']/div/table//tbody/tr/td[6]")).click();
                          }
                      }
      

      邮箱路径可能会改变(你需要根据你的工作改变)

      【讨论】:

        【解决方案4】:

        第一个问题的答案: Sendkeys() 方法是指用户对网页上特定文本框的输入,我们也可以使用 javascriptExecuter 进行相同的操作。

        第二个问题的答案: 据我所知没有。但我不太确定。

        在 Java 中使用以下代码登录 Gmail。

        但是我可以说,在点击登录按钮后,收件箱页面需要一些时间来加载(最多大约 10 秒)

        因此,如果您在没有任何等待(隐式或显式)的情况下搜索另一个元素,那么它将抛出错误。

        driver.get("http://www.gmail.com/");

        driver.findElement(By.id("Email")).sendKeys("userName");

        driver.findElement(By.id("next")).click();

        driver.findElement(By.id("Passwd")).sendKeys("password");

        driver.findElement(By.id("signIn")).click();

        然后你可以使用 Thread.sleep(10000) 或者如果你写了任何等待方法让驱动等待下一个对象可见,你可以使用那个。

        【讨论】:

          【解决方案5】:

          当然,Selenium 只是提供了编写自动化测试脚本的库。如果你想扮演一个人。然后你应该在你的测试步骤之间添加一些等待语句到整个脚本中。除非您没有在脚本中添加任何等待,否则它只会像机器人测试一样运行。如果您以测试自动化工具为例,该工具不会为自动化测试添加任何额外的信息/操作。这就是自动化测试......它不是自动测试。这只是由机器完成的计算机辅助测试。我希望现在你会更清楚上面的例子。

          【讨论】:

          • 你好@vishal8 你能解释一下你的解决方案吗?如果需要,还可以尝试将网站作为源或参考以及一些代码。
          • 嗨@0rkan 我认为不需要任何链接或演示代码来详细说明上述问题。我添加了一些对理解 selenium 测试执行非常有用的关键点。
          【解决方案6】:

          另一种解决方案是第一次尝试发送错误的电子邮件,在错误消息之后,您可以应用正确的电子邮件,这是人为操作。

          【讨论】:

            猜你喜欢
            • 2023-01-28
            • 1970-01-01
            • 2018-08-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-09-16
            相关资源
            最近更新 更多