在下面的代码中我无法在密码字段中发送密码密钥,我尝试点击字段,清除字段并发送密钥。但现在正在使用任何方法。但是如果我调试和测试它的工作
public class TestMail {
protected static WebDriver driver;
protected static String result;
@BeforeClass
public static void setup() {
System.setProperty("webdriver.gecko.driver","D:\\geckodriver.exe");
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
}
@Test
void Testcase1() {
driver.get("http://mail.google.com");
WebElement loginfield = driver.findElement(By.name("Email"));
if(loginfield.isDisplayed()){
loginfield.sendKeys("ragesh@gmail.in");
}
else{
WebElement newloginfield = driver.findElemnt(By.cssSelector("#identifierId"));
newloginfield.sendKeys("ragesh@gmail.in");
// System.out.println("This is new login");
}
driver.findElement(By.name("signIn")).click();
// driver.findElement(By.cssSelector(".RveJvd")).click();
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
// WebElement pwd = driver.findElement(By.name("Passwd"));
WebElement pwd = driver.findElement(By.cssSelector("#Passwd"));
pwd.click();
pwd.clear();
// pwd.sendKeys("123");
if(pwd.isEnabled()){
pwd.sendKeys("123");
}
else{
System.out.println("Not Enabled");
}
答案 0 :(得分:6)
尝试设置隐含等待时间可能为10秒。
gmail.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
或设置明确的等待。显式等待是您定义的代码,用于在进一步执行代码之前等待某个条件发生。在您的情况下,它是密码输入字段的可见性。 (感谢ainlolcat的评论)
WebDriver gmail= new ChromeDriver();
gmail.get("https://www.gmail.co.in");
gmail.findElement(By.id("Email")).sendKeys("abcd");
gmail.findElement(By.id("next")).click();
WebDriverWait wait = new WebDriverWait(gmail, 10);
WebElement element = wait.until(
ExpectedConditions.visibilityOfElementLocated(By.id("Passwd")));
gmail.findElement(By.id("Passwd")).sendKeys("xyz");
解释:selenium找不到该元素的原因是因为密码输入字段的id最初是Passwd-hidden。点击"下一步"按钮,Google首先验证输入的电子邮件地址,然后显示密码输入字段(通过将密码从Passwd-hidden更改为Passwd)。因此,当密码字段仍然隐藏时(即Google仍在验证电子邮件ID),您的webdriver将开始搜索ID为Passwd的密码输入字段,该字段仍然是隐藏的。因此,抛出异常。
答案 1 :(得分:3)
“元素不可交互” 错误可能意味着两件事:
一个。 元素未正确呈现:
解决方案就是使用隐式/显式等待
隐式等待:
driver.manage().timeouts().implicitlyWait(50, TimeUnit.SECONDS);
显式等待:
WebDriverWait wait=new WebDriverWait(driver, 20); element1 = wait.until(ExpectedConditions.elementToBeClickable(By.className("fa-stack-1x")));
B. 元素已呈现,但不在屏幕的可见部分:
解决方案只是滚动到元素。基于 Selenium 的版本,它可以以不同的方式处理,但我将提供一个适用于所有版本的解决方案:
JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].scrollIntoView(true);", element1);
假设所有这些都失败了,那么另一种方法是再次使用 Javascript 执行器,如下所示:
executor.executeScript("arguments[0].click();", element1);
如果您仍然无法点击 ,则可能意味着两件事:
1. iframe
检查 DOM 以查看您正在检查的元素是否存在于任何框架中。如果这是真的,那么您需要在尝试任何操作之前切换到此帧。
driver.switchTo().frame("a077aa5e"); //switching the frame by ID
System.out.println("********We are switching to the iframe*******");
driver.findElement(By.xpath("html/body/a/img")).click();
2.新标签
如果打开了一个新选项卡并且该元素存在于其上,则您再次需要编写类似下面的代码以在尝试操作之前切换到它。
String parent = driver.getWindowHandle();
driver.findElement(By.partialLinkText("Continue")).click();
Set<String> s = driver.getWindowHandles();
// Now iterate using Iterator
Iterator<String> I1 = s.iterator();
while (I1.hasNext()) {
String child_window = I1.next();
if (!parent.equals(child_window)) {
driver.switchTo().window(child_window);
element1.click()
}
答案 2 :(得分:2)
请尝试选择这样的密码字段。
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement passwordElement = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#Passwd")));
passwordElement.click();
passwordElement.clear();
passwordElement.sendKeys("123");
答案 3 :(得分:2)
您也可以尝试使用完整的xpath,我遇到了类似的问题,我必须单击具有属性JavaScript onclick函数的元素。完整的xpath方法有效,并且没有引发可交互的异常。
答案 4 :(得分:0)
我遇到了同样的问题,然后找出了原因。我试图输入一个span标签而不是一个input标签。我的XPath是用span标签编写的,这是错误的做法。我检查了元素的HTML并发现了问题。然后,我要做的就是找到恰好是子元素的输入标签。如果您的XPath是使用输入标记名创建的,则只能在输入字段中键入
答案 5 :(得分:0)
使用超时来执行所需的动作要好得多,因此,一旦元素变得棘手,它将自动执行,而不是仅仅等待不断。我使用免费的TestProject automation SDK来简化此类操作。这是代码中的简短示例:
by = By.xpath("//input[@class='btn btn-primary search_button last ']");
driver.testproject().clickIfVisible(by,10);
其中10是此操作的超时。还有其他使用isDisplayed,isClickable等实现它的方法...
答案 6 :(得分:0)
在我的情况下,生成Exception的元素是属于表单的按钮。我替换了
WebElement btnLogin = driver.findElement(By.cssSelector("button"));
btnLogin.click();
使用
btnLogin.submit();
我的环境是chromedriver Windows 10
答案 7 :(得分:0)
我要用这个对冲这个答案:我知道这很废话,而且有一种更好的方法。 (请参阅上面的答案)但是我尝试了所有建议,但仍然无效。最终追逐错误,将代码撕成碎片。然后我尝试了这个:
import keyboard
keyboard.press_and_release('tab')
keyboard.press_and_release('tab')
keyboard.press_and_release('tab') #repeat as needed
keyboard.press_and_release('space')
这是非常令人无法忍受的,并且您必须确保自己不会失去注意力,否则,您将只是在错误的事情上分页和间隔。
我对其他方法为何对我不起作用的假设是,我试图点击开发人员不希望机器人点击的内容。所以我没有点击它!
答案 8 :(得分:0)
如果它在调试中工作,那么 wait
必须是正确的解决方案。
我建议使用显式 wait
,如下所示:
WebDriverWait wait = new WebDriverWait(new ChromeDriver(), 5);
wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#Passwd")));
答案 9 :(得分:-1)
我收到此错误是因为我在 Selenium WebDriver Node.js 函数 By.css()
中使用了错误的 CSS 选择器。
您可以通过 JavaScript 函数 document.querySelectorAll()
在网络浏览器的网络控制台(Ctrl+Shift+K 快捷键)中使用它来检查选择器是否正确。