好的,所以我一直致力于一个可以通过java中的html unit / selenium驱动程序访问twitter的程序。这是我正在尝试构建的更大程序的一部分。无论如何,我已经成功地使用我的帐户登录到twitter,甚至让它搜索其他帐户但是当我尝试发推文时,我收到如下错误消息:
"Exception in thread "main" java.lang.UnsupportedOperationException: You may only set the value of elements that are input elements
at org.openqa.selenium.htmlunit.HtmlUnitKeyboard.sendKeys(HtmlUnitKeyboard.java:82)
at org.openqa.selenium.htmlunit.HtmlUnitWebElement.sendKeys(HtmlUnitWebElement.java:343)
at javaapplication4.JavaApplication4.main(JavaApplication4.java:41)
Java结果:1“
我不确定问题是什么。这是我的代码:
WebDriver driver = new HtmlUnitDriver();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.get("https://twitter.com/login");
System.out.println(driver.getCurrentUrl());
WebElement element = driver.findElement(By.name("session[username_or_email]"));
element.sendKeys("A*****K*****");
WebElement pass = driver.findElement(By.name("session[password]"));
pass.sendKeys("*******");
pass.sendKeys(Keys.ENTER);
System.out.println(driver.getCurrentUrl());
WebElement tweet = driver.findElement(By.id("tweet-box-mini-home-profile"));
tweet.click();
WebElement tweet2 = driver.findElement(By.id("tweet-box-global-label"));
tweet2.sendKeys("A");
WebElement send = driver.findElement(By.className("btn primary-btn tweet-action tweet-btn js-tweet-btn"));
send.click();
driver.close();
答案 0 :(得分:1)
似乎有两个不同的元素,名称= session [username_or_email]。默认情况下,Selenium会收到它从标记中找到的第一个。那个是隐藏的,所以如果你收到错误会更有意义"元素不可见,因此无法与#34;进行交互。无论如何,在定义定位器时尝试更具说明性,即:
WebElement element = driver.findElement(By.xpath("//form[@class=\"t1-form clearfix signin js-signin\"]//input[@name=\"session[username_or_email]\"]"));
编辑: 对不起,我没有读好这个问题。无论如何,你为什么要把你的文字发送到:
WebElement tweet2 = driver.findElement(By.id("tweet-box-global-label"));
似乎对应于:
<span id="tweet-box-global-label" class="visuallyhidden">Tweet text</span>
从我在Twitter上看到的,您应该将文本发送到第一个元素:
WebElement tweet = driver.findElement(By.id("tweet-box-mini-home-profile"));
无论如何,似乎Javascript正在onClick上执行某些操作,因此您可能需要在向其发送文本之前再次查找此元素,否则您可能会在那里看到StaleElementException
。