作为学习Selenium WebDriver的练习,我试图访问Twitter log in page并登录。我终于能够导航到页面并为用户名字段获取所需的*元素:
<input class="text-input email-input js-signin-email" name="session[username_or_email]" type="text">
*我试图找到sendKeys
可以使用哪些类型的元素,但我找不到。我认为该元素是我想要的元素,因为代码是<input>
类型。
在分配元素后在元素上调用sendKeys
时,会得到ElementNotInteractableException
。我尝试对ExpectedConditions
和visibilityOf
的{{1}}使用显式等待。 invisibilityOf
和TimeoutException
的相应解释告诉我,我上面提到的元素加载到DOM树中,但从不可见*。我该如何解决?是否有使用ElementNotInteractableException
的解决方案?
*周围的html可能会揭示元素为何保持不可见的原因:
JavascriptExecutor
。
**对于那些正在寻找猎物的人,this问题很有帮助,特别是如果问题是由<form class="t1-form clearfix signin js-signin"
action="https://twitter.com/sessions" method="post">
::before
<fieldset>
<legend class="visuallyhidden">Log in</legend>
<div class="clearfix field">
::before
<input class="text-input email-input js-signin-email"
name="session[username_or_email]" type="text">
方法引起的。
答案 0 :(得分:1)
您可以使用以下代码:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class Test {
public static void main(String[] args) throws InterruptedException {
final WebDriver driver = new ChromeDriver();
driver.get("https://twitter.com/login?lang=en");
WebDriverWait wait = new WebDriverWait(driver, 10);
// locate login input
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@placeholder = 'Phone, email or username']")));
WebElement loginInput = driver.findElement(By.xpath("//input[@placeholder = 'Phone, email or username']"));
loginInput.click();
loginInput.sendKeys("login");
// locate password input
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//fieldset//input[@placeholder = 'Password']")));
WebElement passInput = driver.findElement(By.xpath("//fieldset//input[@placeholder = 'Password']")); // this xPath does the trick
passInput.click();
passInput.sendKeys("password");
Thread.sleep(3000); // only to see the result
//locate submit button
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//button[@type= 'submit']")));
WebElement submitBtn = driver.findElement(By.xpath("//button[@type= 'submit']"));
submitBtn.click();
Thread.sleep(3000); // only to see the result
driver.quit();
}
}
答案 1 :(得分:1)
编辑:虽然我在StackOverflow上没有看到这个问题,但是显然我没有做足够的研究。离开这个问题,以防有人帮助。
使用JavascriptExecutor
(来源1):
import org.openqa.selenium.JavascriptExecutor;
JavascriptExecutor executor= (JavascriptExecutor) driver;
executor.executeScript(script, arguments);
sendKeys
替代方案,我们需要执行一些JS,该JS使用点表示法设置元素的文本值。我们必须首先找到元素。 (来源1。)使用document.getElementById('id')
,document.getElementsByTagName('name')
或document.getElementsByClassName('class')
查找元素(来源2)。请注意,在最后两个用于查找元素的选项中,收集了多个元素,因此请为所需的索引。原来是我的解决方案的示例代码行:
executor.executeScript("document.getElementsByClassName('js-username-field email-input js-initial-focus')[0].value='someValue';");
请注意,.getElementById('id')
可能是首选,但在我的情况下,网站设计者决定不合作,不提供id属性。
以下是有关该主题的两个(令人难以置信的!)资源-签出来!